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

ryanwaits / cadence

A changelog video engine that refuses to fabricate your product.

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

ryanwaits/cadence має індекс здоров’я 48 зі 100, що відповідає смузі «У зоні ризику». Найвищий показник — Engineering Quality (66/100), найнижчий — Community & Adoption (29/100). Останнє оновлення було 21 день тому. Більшість нещодавньої роботи виконує один учасник.

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

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

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

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

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

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

Власність

RyanОсобистий обліковий запис
47 підписників52 публічні репозиторіїз січ. 2013 р.Open to new roles

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

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

РеєстрПакетВерсіяЗавантажень / місВерсіїОстання публікація
npm@waits/cadence0.13.03951821 день тому

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

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

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

65Помірний · 22% загального індексу

Активність розробки

49У зоні ризику
Як обчислюється оцінка
28.8/36Свіжість push — останній push 21 дн. тому
2.1/36Ритм комітів — 3/52 тижнів із комітами
18/18Обсяг комітів — 106 комітів за останній рік
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Використані вхідні дані
commits_last_year106
human_commit_share1
days_since_last_push21
active_weeks_last_year3
Як обчислюється оцінка
16.2/27Випускає релізи — 18 тегів версій (без релізів GitHub)
36/36Свіжість релізів — останній реліз 21 дн. тому
27/27Ритм релізів — реліз кожні ~3,1 дн.
0/10OpenSSF Scorecard: Signed-Releases — немає даних
Використані вхідні дані
releases_count18
latest_release_tagv0.13.0
releases_from_tagsтак
days_since_latest_release21
mean_days_between_releases3,1
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: Signed-Releases. Залишкові ваги перенормовано.

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

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

29Критичний · 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ні
Як обчислюється оцінка
34.6/80Щомісячні завантаження — 395 завантажень/місяць у npm
0/20Залежні пакети в реєстрі — ця екосистема цього не повідомляє
Використані вхідні дані
packages@waits/cadence
dependents
ecosystemsnpm
total_downloads
monthly_downloads395
Виключено з оцінювання (немає даних або не застосовно): Залежні пакети в реєстрі. Залишкові ваги перенормовано.

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

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

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

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

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

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

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

66Помірний · 20% загального індексу
Як обчислюється оцінка
24/24Процеси CI — 2 процес(ів) CI
24/24Наявні тести
0/16Конфігурація лінтера
0/9.6Pre-commit-хуки
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — немає даних
Використані вхідні дані
has_ciтак
has_testsтак
has_editorconfigні
has_linter_configні
has_precommit_configні
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: CI-Tests. Залишкові ваги перенормовано.
Як обчислюється оцінка
30/30README
25/25Каталог документації
0/15Сайт документації / домашня сторінка
10/10Опис репозиторію
0/10Теми
10/10Wiki
Використані вхідні дані
topics
has_wikiтак
homepage
has_readmeтак
has_docs_dirтак
has_descriptionтак

Безпека

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

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

Стан безпеки

26Критичний
Як обчислюється оцінка
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — немає даних
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Ліцензія — license file detected
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 — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — немає даних
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
2.2/7.5Vulnerabilities — 7 existing vulnerabilities detected
Використані вхідні дані
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate2,6
Виключено з оцінювання (немає даних або не застосовно): ci_tests, packaging, signed_releases. Залишкові ваги перенормовано.
Як обчислюється оцінка
35/35Прямі залежності без відомих сповіщень — жодна пряма залежність не має відомих сповіщень
9.4/25Непрямі залежності без відомих сповіщень — уражено 2: ws 8.20.1 (high 7.5), esbuild 0.28.0 (low 2.5)
40/40Немає задавнених сповіщень — жодне сповіщення не є публічним довше за 90 дн.
Використані вхідні дані
sourceosv
advisories2
affected_packages2
assessed_packages274
unassessed_packages0
affected_by_severityhigh 1, low 1
direct_affected_packages0
Звірено з runtime-замиканням залежностей npm:@waits/cadence@0.13.0 — тим, що тягне за собою встановлення опублікованого пакета, — 274 пакетів. Досяжність не аналізується.

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

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

63Помірний · 0% загального індексу
Як обчислюється оцінка
45/45Інструкції для агентів — .cursor/rules/cadence.mdc
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 100 з 100 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share1
agent_instruction_files.cursor/rules/cadence.mdc
agent_instruction_max_bytes23 360
Як обчислюється оцінка
0/18Розгортання однією командою
22/22Автоматизовані тести
0/11Конфігурація лінтера / форматера
11/11Статична перевірка типів — tsconfig.json
0/10Відтворюване середовище
0/10Підтверджена практика роботи з агентами — серед останніх 100 комітів немає створених агентом
0/8Автоматизоване супроводження — автоматичних оновлень залежностей не виявлено
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Використані вхідні дані
has_nixні
has_testsтак
lockfiles
has_dockerfileні
typed_languageтак
bootstrap_files
has_devcontainerні
has_linter_configні
typecheck_configstsconfig.json
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0
Як обчислюється оцінка
45/45Типізований код — TypeScript (статично типізована)
55/55Керовані розміри файлів — 0/125 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languageTypeScript
largest_source_bytes13 384
source_files_sampled125
oversized_source_files0

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

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

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

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

Докладніше

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

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

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
н/дCI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
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
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
н/дSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
3Vulnerabilities7 existing vulnerabilities detected
Прямі залежності 8
РеєстрПакетОбмеження версіїМаніфест
npm@remotion/cli4.0.471package.json
npm@remotion/google-fonts4.0.471package.json
npmreact19.0.0package.json
npmreact-dom19.0.0package.json
npmremotion4.0.471package.json
npmshiki4.2.0package.json
npmtsx4.22.4package.json
npmzod4.4.3package.json
Усі залежності не зібрано

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

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

Встановлення npm:@waits/cadence@0.13.0 тягне 274 пакетів, прямих і транзитивних: 2 мають відомі сповіщення, з них 0 — прямі залежності.

ПакетВерсіяЗв'язокКритичністьСповіщеньВиправлено в
ws8.20.1непрямависока18.21.0
esbuild0.28.0непряманизька10.28.1

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

Звіт у форматі JSON машиночитний
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 36884,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "HTML": 6830,
        "JavaScript": 1287,
        "TypeScript": 399743
      },
      "pushed_at": "2026-07-05T21:39:39Z",
      "created_at": "2026-06-04T19:30:42Z",
      "owner_type": "User",
      "updated_at": "2026-07-05T21:39:45Z",
      "description": "A changelog video engine that refuses to fabricate your product.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript"
      ]
    },
    "owner": {
      "blog": "ryanwaits.com",
      "name": "Ryan",
      "type": "User",
      "login": "ryanwaits",
      "company": "Open to new roles",
      "location": "Austin, TX",
      "followers": 47,
      "avatar_url": "https://avatars.githubusercontent.com/u/3207017?v=4",
      "created_at": "2013-01-07T15:04:33Z",
      "is_verified": null,
      "public_repos": 52,
      "account_age_days": 4948
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.13.0",
          "kind": "minor",
          "published_at": "2026-07-05T21:24:18Z"
        },
        {
          "tag": "v0.12.0",
          "kind": "minor",
          "published_at": "2026-06-08T18:27:59Z"
        },
        {
          "tag": "v0.11.1",
          "kind": "patch",
          "published_at": "2026-06-08T18:09:06Z"
        },
        {
          "tag": "v0.11.0",
          "kind": "minor",
          "published_at": "2026-06-08T17:52:21Z"
        },
        {
          "tag": "v0.10.0",
          "kind": "minor",
          "published_at": "2026-06-08T03:46:58Z"
        },
        {
          "tag": "v0.9.1",
          "kind": "patch",
          "published_at": "2026-06-07T21:54:44Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-06-07T19:28:08Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-06-07T17:53:39Z"
        },
        {
          "tag": "v0.7.3",
          "kind": "patch",
          "published_at": "2026-06-07T17:42:06Z"
        },
        {
          "tag": "v0.7.2",
          "kind": "patch",
          "published_at": "2026-06-07T17:26:59Z"
        },
        {
          "tag": "v0.7.1",
          "kind": "patch",
          "published_at": "2026-06-07T16:51:31Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-06-07T16:33:27Z"
        },
        {
          "tag": "v0.6.1",
          "kind": "patch",
          "published_at": "2026-06-06T21:40:40Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-06-06T21:27:28Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-06-06T21:16:20Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-06-06T20:40:57Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-06-06T19:56:35Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-06-04T19:46:11Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "7020127bf0dab82cf5d278acadee0b105a72d82e",
          "body": null,
          "is_bot": false,
          "headline": "chore: version packages",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-07-05T21:39:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "41549d8ce79f5e6d41cd4cfd8753cd55bbb04e2e",
          "body": "…an fixes\n\nThe 0.11/0.12 backdrop fixes (65fc6da ken-burns overscan, 6b0f483 full-opacity\nfirst frame) changed every rendered still but the golden manifest was never\nre-captured. Verified pre-existing: baselines captured at b3b83f0 and current\nHEAD are byte-identical, so the intervening 13 commits are pixel-neutral.",
          "is_bot": false,
          "headline": "test(regression): re-baseline goldens after backdrop opacity + oversc…",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-07-05T21:24:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e8626991c48de31c7684e3010d3d257c0d203d53",
          "body": "docs(skill): generate the panel picker; fix authoring.md timing + quote drift\n\nHalf of Cadence's drift-lock machinery existed (sync-skill generates a\nvocabulary block + digest) but nothing ran it in CI, and the hand-written\npanel-picker table + authoring.md had already drifted from the registry\n(mis\n[…]\nming claim).\nThis closes both gaps: a CI workflow enforces the existing check scripts,\nand the panel picker is now a second generated block so new panel kinds\ncan never go missing from the docs again.",
          "is_bot": false,
          "headline": "ci: run check/test/check:motion/check:skill on push+PR",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-07-05T21:03:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "574546e8b281d94a75dd0bc364df3c6a688344ab",
          "body": null,
          "is_bot": false,
          "headline": "docs(kinds): update stale kind name in types comment",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-07-05T20:18:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6c6e78e66e2fe52fc7b5a6bf07bd53cef7e8de34",
          "body": "minor: audit/redesign fold into edit/fork (deprecated aliases kept),\nfeature-launch/changelog-reel kind aliases and the --template-as-kind\nshim removed, Action's deprecated template input dropped.",
          "is_bot": false,
          "headline": "chore: add changeset for verb consolidation",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-07-05T20:16:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "27803ffed1ba7e7ddaf83f12247abf20e75e6139",
          "body": "Drop the feature-launch/changelog-reel alias sentence and cadence\naudit/redesign mentions from the skill, videos guide, and README's CLI\nblock (now lists new/edit/fork/storyboard alongside create/study);\nremove the deprecated Action `template` input row from\nship-on-release.md and pin its example `uses:` line like recipes.md.\nRegenerated skills/cadence/ and .cursor/rules/cadence.mdc via\n`bun run sync-skill`.",
          "is_bot": false,
          "headline": "docs: scrub deprecated verb/alias mentions",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-07-05T20:16:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2b654f017660fc1483f0885e8910c70234244496",
          "body": "Removes the DEPRECATED template input and its precedence branch from\naction.yml (kind is now the only way to pick the structural arc); updates\nthe in-repo example workflow from `template: changelog-reel` to\n`kind: changelog`.",
          "is_bot": false,
          "headline": "fix(action): drop deprecated `template` input; use `kind`",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-07-05T20:16:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "974be626e62f7adefc41f4c2533e7d0e99be62ba",
          "body": "- cadence audit / cadence redesign now print a deprecation note and\n  dispatch to edit / fork respectively (redesign no longer auto-renders —\n  it points at `cadence create <file>` instead).\n- Delete the feature-launch/changelog-reel kind aliases and the\n  --template-as-kind shim in make.ts; unknown-kind errors and the kinds\n  listing no longer need dedupe now that KINDS has no alias keys.\n- Remove the audit/redesign/create package.json script entries (dev\n  flows use `bun run cli <verb>`).",
          "is_bot": false,
          "headline": "refactor(cli)!: fold audit into edit, drop legacy verb/kind aliases",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-07-05T20:15:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "40a6514d4384e9714d01600f1a97c0a46645bcbc",
          "body": "fork now takes --background/--enter/--exit (verbatim from redesign's\nparseBackground + setTitleMotion), applying the override to every beat\nas a pure data rewrite — same atomic, no-render contract fork already had.",
          "is_bot": false,
          "headline": "refactor(fork): fold redesign's restyle flags into fork",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-07-05T20:15:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "44f56f417dd62fd9c95c513ecb60428842d051b6",
          "body": null,
          "is_bot": false,
          "headline": "docs(action): drop internal plan reference from status note",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-07-05T20:06:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "278f588f22fd27497f6033f99758ec7643b73b6d",
          "body": "The Action's theme-file input silently no-oped on the actual MP4 render\nbecause make.ts only forwarded it on the --dry-run (storyboard) path.\nAlso absorb the manual gh release upload step behind an `upload: true`\ninput, and fix doc inaccuracies (v1 pin note, upload docs, status).",
          "is_bot": false,
          "headline": "fix(action): forward --theme-file to the render path; add upload input",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-07-05T20:04:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "adc157aff2c20fdfddf8100508bfdbab454ea33e",
          "body": "…ean errors + honest exit codes everywhere\n\n- extract create's routing sniff into scripts/_route.ts, flag-aware so a\n  --theme-file value ending in .json/.ts no longer misroutes to render\n- add runScript() (spawn + exit non-zero on launch failure) and adopt it in\n  cli.ts/make.ts/redesign.ts/render.\n[…]\nthe default; gh spawn failures get a clear message instead of\n  printing literal \"null\"\n- fix render.ts/make.ts usage strings to reference the public `cadence`\n  verbs instead of internal script names",
          "is_bot": false,
          "headline": "fix(cli): route create on real beats positionals, not flag values; cl…",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-07-05T19:57:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "97f43084528f4c5366ebe5d1f5144365f8c32b0e",
          "body": "Theming had no fail-fast gate: a typo'd --template, a malformed\n.cadence/theme.json, or study --accent blue all silently produced a\nwrong-looking (or #NaNNaNNaN) render with exit 0. This gives theming the\nsame validate-or-exit behavior beats already have via cadence edit.",
          "is_bot": false,
          "headline": "fix(theme): validate theme files and template names at the CLI boundary",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-07-05T19:48:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b3b83f009825482da03f881e81cbd3c048b1bc3b",
          "body": null,
          "is_bot": false,
          "headline": "chore: version packages",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-08T18:31:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c350132c1b3909700ec0431c962e651c4f36a7e2",
          "body": "Most platforms grab frame 0 for the poster. `--poster [frame]` renders an\nextra still alongside the mp4, defaulting to a settled frame near the end of\nthe first beat (content fully revealed) rather than the opening frame.",
          "is_bot": false,
          "headline": "feat(render): --poster still for social thumbnails",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-08T18:27:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6b0f4839b476ace8d71e57e30cf65c23fb0bbfc5",
          "body": "The backdrop opacity ramp exists so a backdrop *change* mid-video crossfades,\nbut the first segment has nothing behind it except the near-black ink base —\nfading it in opened every video on a black frame (and a black social\nthumbnail). The first segment now skips the fade; later segments still\ncrossfade.",
          "is_bot": false,
          "headline": "fix(background): render the first backdrop at full opacity from frame 0",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-08T18:27:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f277e76c69f4271f2e3495fbecd49468a92ca70f",
          "body": null,
          "is_bot": false,
          "headline": "chore: version packages",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-08T18:10:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "65fc6da00522220ac0c752e5429190dbba6d317f",
          "body": "… edge\n\nThe image backdrop's Ken Burns pan started at scale 1 with a -12px vertical\nshift, leaving zero overscan at frame 0 and uncovering a chrome-colored strip\nalong the bottom. The continuous-background layer made it persist across the\nopening beats of a shared backdrop instead of flashing per be\n[…]\nscale at 1.04 so the pan is always covered; extract a pure kenBurns()\nhelper with a regression test asserting no edge exposure across every frame.\nAlso fix the gradient/solid fill starting at scale 0.",
          "is_bot": false,
          "headline": "fix(background): keep ken burns overscan so backdrops never expose an…",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-08T18:09:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d651001c3aa79d19eaf682f70ddf5c71c4c36f28",
          "body": null,
          "is_bot": false,
          "headline": "chore: version packages",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-08T17:52:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b29d9160eb0bf167195fd5cf70bb8983d8ee84bd",
          "body": null,
          "is_bot": false,
          "headline": "chore: add changeset for the unified authoring model",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-08T17:46:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "47c641dfef5a6ed2a841ed8959f52c56a69abc84",
          "body": "Fill the skill's generated block from `cadence capabilities` (panel\nkinds, motion presets, timing tokens) with the schemaDigest embedded, so\nthe skill can't drift from the engine and a schema change fails the sync\ncheck. Rewrite the authoring guidance for the single node-tree model +\nkey-shorthand, and document the inspect/capabilities verbs and scrim.",
          "is_bot": false,
          "headline": "docs(skill): generate vocabulary from capabilities; document one model",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-08T17:43:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c98a8ac6b6d95c19f74c7d7543e3b81d00842efc",
          "body": null,
          "is_bot": false,
          "headline": "feat(cli): add inspect verb for resolved regions/timings/colors",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-08T17:43:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5c74cf4037a89b6de86b7df1b14f5c98698d660b",
          "body": "A single pure resolver turns a beat's node tree into regions + per-element\nreveal timings + resolved colors. The renderer now delegates its reveal\nmath to it (byte-identical), so \"when does the panel reveal / what color\nis the title\" has one source the inspect verb can read.",
          "is_bot": false,
          "headline": "feat(resolve): shared beat resolver for the renderer and inspect",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-08T17:43:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4e59403488e7bf6fb6cfee28bc7c8269523c6959",
          "body": "`cadence capabilities` emits a machine-readable manifest of every node,\npanel kind, motion preset, placement option, background/scrim, and\ntheme/timing token — types, defaults, ranges, and feel/use notes —\nwalked FROM the zod schemas + registries so it can't drift. Carries a\nschemaDigest (+ --digest). An invariant test proves the former timing\nconstants are gone from code and enumerable as tokens.",
          "is_bot": false,
          "headline": "feat(cli): add capabilities verb generated from the schemas",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-08T17:29:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "41beab245ea0f11b47d81d27b48a19f8aa1627fb",
          "body": null,
          "is_bot": false,
          "headline": "feat(schema): annotate fields with capability metadata",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-08T17:29:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e18c06902fafe5fa530370f50946e03b6b5999fb",
          "body": "Move the hardcoded frame-timing constants (typing speed, output gap,\nsettle, entrance/exit durations) into a template `timing` token, and\nrender a real legibility scrim — a `hero` beat over an image gets the\ntemplate `heroScrim` so white titles stay readable over bright art.\nTiming change is byte-identical; only the one hero-over-image still\nupdates.",
          "is_bot": false,
          "headline": "feat(motion): lift timing + scrim into template tokens",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-08T17:15:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5e95c33ef4e2686a7e1721414e5c6d4419b630bc",
          "body": null,
          "is_bot": false,
          "headline": "feat(schema): add background scrim legibility wash",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-08T17:15:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d99cfb92cab6ace6648bcf77ba9485d11abee190",
          "body": null,
          "is_bot": false,
          "headline": "fix(art): show usage on --help and bare invocation",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-08T17:15:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "be63726891fe6f94d93616030330318d49c3e642",
          "body": "Delete the flat beat fields (headline/eyebrow/code/panel/caption/badge/\nnote/hero) and desugarBeat. A beat's `components` tree is now the only\nauthoring model; terse key-shorthand normalizes into it before parse.\n`components` is required with a >=1 renderable-leaf check; `layout` gains\n`hero`. Renders byte-identical to the prior output.",
          "is_bot": false,
          "headline": "feat(schema)!: collapse to single node-tree authoring model",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-08T16:49:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c49f1ad71ab71aaa469d59bfe12b963936828972",
          "body": null,
          "is_bot": false,
          "headline": "refactor(layout): add shared groupByRegion/pickIn module",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-08T16:49:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d360fa814e2280045287134c00695454dcf7e366",
          "body": null,
          "is_bot": false,
          "headline": "refactor(kinds): emit components + layout instead of flat fields",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-08T16:49:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "56458d5cb32e1c4f8ed24a9702b290ebde63941b",
          "body": null,
          "is_bot": false,
          "headline": "refactor(content): author beats as node trees",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-08T16:49:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2536855b2be6a32f40be7a8b46bff59ab4e07a30",
          "body": null,
          "is_bot": false,
          "headline": "feat(schema): node-sugar normalizer for the single authoring model",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-08T16:49:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "075e6fb6a843c5dc55219cd367c47a44203693f5",
          "body": null,
          "is_bot": false,
          "headline": "chore: version packages",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-08T03:46:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2fd5a584bc1b3e6c5d38ce744e951da77746cd78",
          "body": "…low + Action)\n\nmake.ts and the GitHub Action used --template/template to mean the structural arc,\ncolliding with --template = the styling layer everywhere else. Now --kind / kind:\nselects the arc and --template / the beats template field selects the look, matching\ncadence new and the rest of the CL\n[…]\n commands + Action workflows keep working;\nthe Action gains a kind input. Bonus: the repo one-shot now honors a styling template.\nAlso fixed remaining stale cli theme/make verb references in the docs.",
          "is_bot": false,
          "headline": "fix(cli): --kind for the arc; --template is the styling layer (repo f…",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-08T03:34:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "caefc34a5caa20479a0ce7dc6c3e9cb671b4ffbd",
          "body": "Consolidates 10 guides → 7. Merges the three per-kind guides into one videos.md\n(kind × template model, new→edit→storyboard→create workflow, honesty ladder, panel\npicker); folds custom-backgrounds into branding-and-formats. Adds composition.md —\nthe v2 component tree (containers, per-node style, seq\n[…]\ns, renamed cli make→create / cli theme→study. Marks the Phase-1 spec historical.\nUpdates the guides index. (The GitHub Action keeps its legacy 'template' input,\nclarified inline — see follow-up note.)",
          "is_bot": false,
          "headline": "docs: consolidate + update guides for kind/template + composition v2",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-08T03:23:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bb03b72f185e832e9bc461b5041bba54fa1b388a",
          "body": "README panel count was stale (listed 9, omitting browser); now 11 with quote, and\nnotes the composable tree / style / sequencing. Adds the minor-bump changeset for\nthe Composition v2 release.",
          "is_bot": false,
          "headline": "docs: README v2 surface + changeset",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-08T02:50:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6362178becbca2f4d457b87898945f99b73012c2",
          "body": "nested-col (code-over-panel + reflow), sequenced (revealAfter), styled (gold +\nchromeless), quote (registry seam). In-repo examples; excluded from npm via\n.npmignore so they don't ship.",
          "is_bot": false,
          "headline": "test(fixtures): composition v2 demo fixtures",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-08T01:50:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3ef36fb09af20464a5b4675c5053857a04b45bdb",
          "body": "… (T9)\n\nedit --explain and the SKILL.md GENERATED:vocabulary block now generate from the\nschema/registry (scripts/_explain.ts) — closed sets can't drift from the engine.\nsync-skill --check is a drift-lint (wired as check:skill). authoring.md + SKILL.md\ndocument containers, per-node style, sequencing (revealAfter/stagger), and reflow.",
          "is_bot": false,
          "headline": "docs(skill): registry-generated --explain + drift-lint + v2 authoring…",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-08T01:50:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1653a4c5790969bedfec62ccee16c5c089ef4391",
          "body": "…veal/style (T5,T6,T7,T8)\n\nT5: ChangelogScene walks components grouped by region (header/lead/trailing/footer),\nre-composites header+lead text into one Headline, reproduces the lead/trailing band\nverbatim — byte-identical, no container recursion needed for legacy.\nT6: row/col/grid/group primitives +\n[…]\nng path); container stagger.\nT8: per-node style applied (resolveRole override, container bg/gap/padding, code chrome,\nHeadline color overrides). desugar test locks the flat tree-compatible shape (T4).",
          "is_bot": false,
          "headline": "refactor(render): region-walking renderer + container primitives + re…",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-08T01:50:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4a069ebebe40e111a4fa218dfd164bb9f61c0d71",
          "body": "Moves codeTypingDoneFrame and friends into motion/timing.ts (no Remotion import)\nso node scripts and the render path share one timing source. Adds settledFrame —\na representative still frame (code typed + panel revealed). CodeWindow re-exports\nthe helper and gains a chrome override; storyboard picks the settled frame and\nlabels panels from the desugared tree (survives nested/authored beats).",
          "is_bot": false,
          "headline": "feat(timing): pure shared timing module + settledFrame (T7)",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-08T01:50:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4dabb3797d7d3a65f67dbe0a58f92c2998d9840d",
          "body": "…,T10)\n\nT3: per-kind schemas collected in PANEL_SCHEMAS; panelSchema assembled from it;\nPANEL_REGISTRY pairs each kind's schema with its component via a mapped type that\nforces completeness (replaces the assertNever switch). Schema and dispatch can't\ndrift. T10 proves the seam: the quote kind is a schema entry + a component + one\nregistry line — no renderer/union edits. byKind made Partial so a self-styled\npanel needs no template entry.",
          "is_bot": false,
          "headline": "feat(registry): assemble panel union from a registry; quote panel (T3…",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-08T01:50:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0cc32b28f005765ac7cd99e0e6286481849761a7",
          "body": "…elds (T1,T2,T7)\n\nT1: row/col/grid/group container schemas via z.lazy confined to the children\nfield (discriminated-union members keep literal discriminants); ComponentInstance\nstays leaf-only, Node added; region-inheritance + reflow rules documented.\nT2: styleSchema — color/bg as theme ROLES only (no raw hex, stays themeable),\ngap/padding/track/chrome/size; COLOR_ROLES single-sourced with a drift assertion.\nT7: optional node id + placement.revealAfter + container stagger.",
          "is_bot": false,
          "headline": "feat(schema): recursive container tree, per-node style, sequencing fi…",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-08T01:50:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f6318716bcde02232710bed8393adf871bcf1467",
          "body": "scripts/regression.ts renders a still at every beat mid-frame across all\ncontent files x 3 formats and sha256-diffs against a committed baseline\n(.regression/golden.json). This is the gate Phase 1 specified but never built\n(smoke.ts only checked for errors); the v2 refactor renders against it. Wires\ncheck:render to run smoke + regression; adds regression and check:skill scripts.",
          "is_bot": false,
          "headline": "feat: byte-identical render regression gate (T0)",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-08T01:50:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cd6ccfe195c1f2ba9d53d3f92ac7fcfbbe6f678f",
          "body": "The accepted design: recursive row/col/grid/group containers inside named\nregions, a component registry, per-node style overrides, sequencing-as-data,\nunder a byte-identical regression gate. Rigidity map, target model, migration,\nphased plan, resolved open decisions.",
          "is_bot": false,
          "headline": "docs: composition v2 RFC — bounded component tree",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-08T01:50:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "644a1b4845e00c642579f1214cf3dd8f8a1044d2",
          "body": null,
          "is_bot": false,
          "headline": "chore: version packages",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-07T21:56:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e2e426ea4a51190b4d286a7ce272c75b27890251",
          "body": null,
          "is_bot": false,
          "headline": "feat: animate the handwritten note with a left-to-right write-in",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-07T21:54:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "57232d3c049e79e281eaae70f510eb8c91ffe204",
          "body": null,
          "is_bot": false,
          "headline": "chore: version packages",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-07T19:47:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ba813c7e980952a5e7dfad6f5fc3e4d0eadecb1b",
          "body": null,
          "is_bot": false,
          "headline": "chore: changeset for the kind/template/composition release",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-07T19:28:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "84a811ae4220b58a6b12cceddae2768e198a6dbf",
          "body": null,
          "is_bot": false,
          "headline": "docs: document the kind/template/composition model in the skill",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-07T19:28:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cbc6728d032c31391e2d67fab6fd0d48c9e86940",
          "body": null,
          "is_bot": false,
          "headline": "feat: add new/fork/edit CLI verbs and kinds/templates listings",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-07T19:23:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f6f8bb3411d12a371b0560593dea3ebe0964c396",
          "body": null,
          "is_bot": false,
          "headline": "fix: break the schema import cycle via a primitives module",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-07T19:23:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aa99d729f161d9f201a65002e137d07a3a67da61",
          "body": null,
          "is_bot": false,
          "headline": "feat: add terminal and instructional templates with a dark theme",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-07T19:10:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c97551aa546fd11603ed5816387ba80a4d304726",
          "body": null,
          "is_bot": false,
          "headline": "feat: add announcement and showcase kinds",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-07T19:10:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4c320ae35e80e43d25c5fedbc528baea6b042bc3",
          "body": null,
          "is_bot": false,
          "headline": "refactor: render beats from the desugared composition model",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-07T19:02:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fa297d1e77139ee18d4d606f6cf9aa95dc97b20e",
          "body": null,
          "is_bot": false,
          "headline": "refactor: extract field-notebook styling into the template layer",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-07T18:53:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5756ffb19f85f8de8fc697d3001d46d2b67131eb",
          "body": null,
          "is_bot": false,
          "headline": "feat: scaffold the template styling layer (skeleton)",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-07T18:41:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "37c38d8107fafbcbffa7cf5bdfac915fa9302eb6",
          "body": null,
          "is_bot": false,
          "headline": "feat: add composition schema and back-compat desugar shim",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-07T18:41:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6138924e788240d9ee100dc8684b0bd9cb8e36b1",
          "body": null,
          "is_bot": false,
          "headline": "refactor: rename templates to kinds with a metadata registry",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-07T18:41:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "70ec501646b3631d0da3620c6af61ae64a12101c",
          "body": null,
          "is_bot": false,
          "headline": "docs: phase-1 spec for kind/template/composition architecture",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-07T18:31:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "82545beaaf175adacf08b9ac0af12d8500452854",
          "body": null,
          "is_bot": false,
          "headline": "chore: version packages",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-07T17:54:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "14d125df593075c439166ee948d35985a3a09f1e",
          "body": null,
          "is_bot": false,
          "headline": "feat: add beat-level handwritten note flourish under the headline",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-07T17:53:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "49a7db58c44050b8776c9f6a31a5234c5e87b2df",
          "body": null,
          "is_bot": false,
          "headline": "chore: version packages",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-07T17:47:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8f64e8f2f30a318b180f2b8cdf12a40c107845c1",
          "body": null,
          "is_bot": false,
          "headline": "fix: align result panel card entrance with the code window",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-07T17:42:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8291e8d76b32ded0c900834d067bbe73985f50bd",
          "body": null,
          "is_bot": false,
          "headline": "chore: version packages",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-07T17:27:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d6902a46c76b4fbc2e1290f65c3efbb0d243f4c7",
          "body": null,
          "is_bot": false,
          "headline": "fix: center beats, show paired panel card while code types, soften scrim",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-07T17:26:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ade496c8d867f9fbcf54cc82d0da0da6091a1cbb",
          "body": null,
          "is_bot": false,
          "headline": "chore: version packages",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-07T17:01:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "57a9ca35df4ed2a04f5a128be8fb76399c72d8e9",
          "body": null,
          "is_bot": false,
          "headline": "fix: strengthen headline legibility over bright backgrounds",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-07T16:51:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "89163a1b79d834b69eaabd46080f52f23ca0c8ed",
          "body": null,
          "is_bot": false,
          "headline": "chore: version packages",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-07T16:39:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f78d43e7898422ea51b61e658788286e0c54a50d",
          "body": null,
          "is_bot": false,
          "headline": "feat: add browser panel and install-open/hero-close launch flow",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-07T16:33:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b750148bc75874fa8c80bee486dc7b44de25f9ac",
          "body": null,
          "is_bot": false,
          "headline": "fix: resolve scoped-package bin hoist for the global CLI",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-07T16:33:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a8a8ebd50d3da4346a53d64522e46bc67259d86e",
          "body": "A \":\"-space in the unquoted SKILL.md description (\"milestone video: 1M…\") is\ninvalid strict YAML, so vercel-labs/skills failed to parse name/description and\nreported \"no valid skills found\". Use an em-dash instead.",
          "is_bot": false,
          "headline": "fix: make skill description valid YAML for skills add",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-07T16:10:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6e5d23632c95852a117f716ea27b7fb397a8604b",
          "body": null,
          "is_bot": false,
          "headline": "chore: version packages",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-06T21:40:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "74988f9f27121df17e083ac0f819ec71ee6107f8",
          "body": "mkdir the --out path's own directory instead of always creating themes/, so\nwriting a theme into a project's .cadence/ leaves no empty themes/ behind.",
          "is_bot": false,
          "headline": "fix: study --out no longer creates a stray themes/ dir",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-06T21:40:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b77b68eb4a438c70b3fd1d931da7d19c15ebf57e",
          "body": "Bring the guides current with 0.6.0: a new project-setup guide for the\n.cadence/ convention (theme + backgrounds + outputs, auto-discovery), and\nupdates across install, branding, the video use-case guides, iterate/preview,\nand CI for storyboard previews, project-local outputs, codeChrome, and\ncadence art (prompt, packs, promote, --brand).",
          "is_bot": false,
          "headline": "docs: refresh guides for the .cadence project convention",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-06T21:33:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cab6fd73b25cd54de52a258c4a41bac79fe53969",
          "body": null,
          "is_bot": false,
          "headline": "chore: version packages",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-06T21:27:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dcffac23f11c27ca0c5c9b195b28afee33fa9fc8",
          "body": null,
          "is_bot": false,
          "headline": "docs: document cadence art --brand",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-06T21:26:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e4848cbf9fdbd6f3cb2aa68f194646cdf181ae19",
          "body": "cadence art --brand reads the discovered .cadence/theme.json and appends an\nexplicit accent + paper palette nudge to the prompt (placed last so it wins over\nthe base style); no theme found → generates unbranded.",
          "is_bot": false,
          "headline": "feat: --brand tints generated art to the project palette",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-06T21:26:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2b4d584c7fab4909988d2086d0e7628f677aeafc",
          "body": null,
          "is_bot": false,
          "headline": "chore: version packages",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-06T21:16:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b110aad9ba9e0f93cb556104ca1ef0d5a4838c34",
          "body": "Reframe the painterly pack as the default of a general generator: a custom\nbackgrounds guide, README + ART-DIRECTION updates, and skill guidance for\ncadence art (prompt, packs, promote, project-local output).",
          "is_bot": false,
          "headline": "docs: generalize art into custom backgrounds",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-06T21:15:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "508ead5e011d67330f71e9a580d76b50652831f9",
          "body": "- cadence art --prompt \"<scene>\" --name x (landmarks become the default pack)\n- --pack <file.json> subject sets + --style-file; cadence art --promote <name>\n- cost guard (--yes for batches; default --quality medium)\n- generated art lives in <project>/.cadence/backgrounds; render stages a merged\n  public dir so project art and built-in assets both resolve",
          "is_bot": false,
          "headline": "feat: freeform art generation + project-local backgrounds",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-06T21:15:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ad493bbf8bcead7dd355ee3718daa416a56d35e7",
          "body": null,
          "is_bot": false,
          "headline": "chore: version packages",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-06T20:40:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7a324663852e8624c7387c27ec2da0f53db9169b",
          "body": null,
          "is_bot": false,
          "headline": "docs: note .cadence/out output location in the skill",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-06T20:40:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c3389c1c25fb58080855155986a4374e8380281f",
          "body": "Anchor render/storyboard/make output to the project's .cadence/out (found by\nwalking up from the beats file or cwd), so outputs follow the project rather\nthan the current directory. Falls back to ./out; override with --out <dir>.",
          "is_bot": false,
          "headline": "feat: write outputs to <project>/.cadence/out",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-06T20:40:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "44072bab8bd492a103119686e4e459ad7e881f5b",
          "body": "Tell the agent to capture a target's brand in <project>/.cadence/theme.json\nand match its docs code styling (mono, codeTheme, codeBg, codeChrome).",
          "is_bot": false,
          "headline": "docs: skill guidance for project .cadence themes",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-06T20:30:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "89555705f4e10de8fc8b2e04582db2e7ea5b4e1c",
          "body": "- auto-discover <project>/.cadence/theme.json when run against a repo\n  (precedence: --theme-file > --theme > .cadence/theme.json > default)\n- add codeChrome \"window\" | \"minimal\" to ThemeConfig; minimal renders a\n  chromeless, docs-style code window",
          "is_bot": false,
          "headline": "feat: project-local .cadence theme + minimal code chrome",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-06T20:30:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "44f6024e4d86d183649b47fb30607bb0aee829a2",
          "body": null,
          "is_bot": false,
          "headline": "chore: version packages",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-06T19:56:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4118dbe20ba1df20fa0aab14a33d73db43262d54",
          "body": "Seven task-oriented guides under docs/guides (install, changelog, announcement,\nmilestone/showcase, branding, iterate/preview with storyboard, CI) plus an\nindex. Scope CLI references to @waits and document the storyboard step.",
          "is_bot": false,
          "headline": "docs: add usage guides and scope CLI references",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-06T19:55:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "339b7c88d84b56763ca32e798750981b5ba0bd58",
          "body": "cadence storyboard <beats> prints the beat-by-beat plan and renders one still\nper beat as a single contact-sheet PNG (no MP4). cadence create ... --dry-run\ndoes the same from a repo or beats file. Stills pass as data URIs into a new\nStoryboard composition; smoke test covers the path.",
          "is_bot": false,
          "headline": "feat: add storyboard dry-run preview",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-06T19:55:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3bcb32ec04ef875bb39ceaa1b5ec6a94b274d7cf",
          "body": "Lift Background into a continuous layer in Changelog; merge consecutive\nsame-backdrop beats into one segment so the backdrop no longer fades to ink\nor resets its Ken Burns between them. Only content transitions per beat; a\nreal backdrop change crossfades.",
          "is_bot": false,
          "headline": "fix: keep backgrounds continuous across same-bg beats",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-06T19:55:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "10e8d2de6eac39c4f63a76907c2931f95aeda0c5",
          "body": "loadBeats/beatTimings in _beats.ts and auditBeats in _audit.ts, reused by\nrender and audit (output unchanged) and the new storyboard command.",
          "is_bot": false,
          "headline": "refactor: extract shared beats loader and audit checks",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-06T19:55:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "789c6d7bae3b3b7446bb467c799cff8b73dc2a59",
          "body": "- rename @ryanwaits/cadence -> @waits/cadence (published 0.2.0)\n- add @changesets/cli + changelog-git with public, changelog-git config\n- add changeset/version/release scripts\n- bump @types/node 12 -> 22 to fix repo-wide tsc",
          "is_bot": false,
          "headline": "chore: set up @waits publishing and changesets",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-06T19:55:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e8d1dee2e3c1b58f7b8e3139b48a67d95e6570a9",
          "body": null,
          "is_bot": false,
          "headline": "fix(adapters): drop changesets boilerplate from changelog features",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-04T19:46:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5ab74bc406b41f521ed3cd026fd53efd137117a5",
          "body": null,
          "is_bot": false,
          "headline": "chore: backdrop art and preview stills",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-04T19:30:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "242aa65909fa2f79ef70331d16a5a11ee03be5f4",
          "body": null,
          "is_bot": false,
          "headline": "docs: README, recipes, gallery, and guides",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-04T19:30:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "da0530a19ead26413d16c8217e053bbb54f9e8e3",
          "body": null,
          "is_bot": false,
          "headline": "feat: example beats videos",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-04T19:30:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6f76a7ebdab8e81ed6757d6d3dbfb87df518502c",
          "body": null,
          "is_bot": false,
          "headline": "feat: GitHub Action for release videos",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-04T19:30:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cf05d2e0a54812fc97525099a93493c9057ca0ac",
          "body": null,
          "is_bot": false,
          "headline": "feat: cadence agent skill for Claude, Cursor, and Codex",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-04T19:30:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5ca56b727c135fb89e045356ce35ca297f9a9354",
          "body": null,
          "is_bot": false,
          "headline": "feat: art prompt system for the optional painterly pack",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-04T19:30:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "feb3e46a5e7519cd110e7d2021e6cda89b99916a",
          "body": null,
          "is_bot": false,
          "headline": "feat: cadence CLI (create, study, audit, redesign)",
          "author_name": "Ryan Waits",
          "author_login": "ryanwaits",
          "committed_at": "2026-06-04T19:30:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 18,
      "commits_last_year": 106,
      "latest_release_at": "2026-07-05T21:24:18Z",
      "latest_release_tag": "v0.13.0",
      "releases_from_tags": true,
      "days_since_last_push": 21,
      "active_weeks_last_year": 3,
      "days_since_latest_release": 21,
      "mean_days_between_releases": 3.1
    },
    "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": "@waits/cadence",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@waits/cadence",
          "is_deprecated": false,
          "latest_version": "0.13.0",
          "repository_url": "https://github.com/ryanwaits/cadence",
          "versions_count": 18,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 395,
          "first_published_at": "2026-06-06T18:49:10.317000Z",
          "latest_published_at": "2026-07-05T21:39:24.408000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 21
        }
      ]
    },
    "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,
        "collected_at": null
      },
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 13384,
      "source_files_sampled": 125,
      "oversized_source_files": 0,
      "agent_instruction_files": [
        ".cursor/rules/cadence.mdc"
      ],
      "agent_instruction_max_bytes": 23360
    },
    "dependencies": {
      "manifests": [
        "package.json"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [
          {
            "name": "ws",
            "direct": false,
            "version": "8.20.1",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-96hv-2xvq-fx4p"
            ],
            "fixed_version": "8.21.0",
            "advisory_count": 1,
            "oldest_advisory_days": 41
          },
          {
            "name": "esbuild",
            "direct": false,
            "version": "0.28.0",
            "severity": "low",
            "ecosystem": "npm",
            "cvss_score": 2.5,
            "advisory_ids": [
              "GHSA-g7r4-m6w7-qqqr"
            ],
            "fixed_version": "0.28.1",
            "advisory_count": 1,
            "oldest_advisory_days": 44
          }
        ],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {
          "low": 1,
          "high": 1
        },
        "advisory_count": 2,
        "affected_count": 2,
        "assessed_count": 274,
        "malicious_count": 0,
        "assessed_package": "npm:@waits/cadence@0.13.0",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "@remotion/cli",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "4.0.471"
        },
        {
          "name": "@remotion/google-fonts",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "4.0.471"
        },
        {
          "name": "react",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "19.0.0"
        },
        {
          "name": "react-dom",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "19.0.0"
        },
        {
          "name": "remotion",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "4.0.471"
        },
        {
          "name": "shiki",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "4.2.0"
        },
        {
          "name": "tsx",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "4.22.4"
        },
        {
          "name": "zod",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "4.4.3"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 0,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "ryanwaits",
          "commits": 106,
          "avatar_url": "https://avatars.githubusercontent.com/u/3207017?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "example-release-video.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": null,
            "reason": "no pull request found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 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": "no SAST tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 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": 3,
            "reason": "7 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "7020127bf0dab82cf5d278acadee0b105a72d82e",
        "ran_at": "2026-07-27T13:13:50Z",
        "aggregate_score": 2.6,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-05T21:40:01Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": null,
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/ryanwaits/cadence",
    "host": "github.com",
    "name": "cadence",
    "owner": "ryanwaits"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "at_risk",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 48,
      "inputs": {
        "security": 38,
        "vitality": 65,
        "community": 29,
        "governance": 39,
        "engineering": 66
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "moderate",
        "name": "Vitality",
        "value": 65,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "at_risk",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 49,
            "inputs": {
              "commits_last_year": 106,
              "human_commit_share": 1,
              "days_since_last_push": 21,
              "active_weeks_last_year": 3
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 21 days ago",
                "points": 28.8,
                "status": "partial",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 21
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "3/52 weeks with commits",
                "points": 2.1,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 3
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "106 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 106
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 88,
            "inputs": {
              "releases_count": 18,
              "latest_release_tag": "v0.13.0",
              "releases_from_tags": true,
              "days_since_latest_release": 21,
              "mean_days_between_releases": 3.1
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "18 version tags (no GitHub releases)",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "version_tags_no_releases",
                    "params": {
                      "count": 18
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 21 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 21
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~3.1 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 3.1
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "critical",
        "name": "Community & Adoption",
        "value": 29,
        "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": "at_risk",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 43,
            "inputs": {
              "packages": [
                "@waits/cadence"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 395
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "395 downloads/month across npm",
                "points": 34.6,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 395,
                      "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": "at_risk",
        "name": "Sustainability & Governance",
        "value": 39,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 13,
            "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 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "critical",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution",
                    "pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "merged_prs": 0,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "no decided pull requests or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_decided_prs_or_data",
                    "params": {}
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "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": 58,
            "inputs": {
              "followers": 47,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "ryanwaits",
              "public_repos": 52,
              "account_age_days": 4948
            },
            "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": "47 followers of ryanwaits",
                "points": 12.1,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 47,
                      "login": "ryanwaits"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "52 public repos, account ~13 yr old",
                "points": 24.6,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 52
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 13
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "@waits/cadence"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 21
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 21 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 21
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "18 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 18
                    }
                  }
                ],
                "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": 66,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 60,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "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": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 38,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "critical",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 26,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 15,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 3,
              "scorecard_aggregate": 2.6
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "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": "no SAST tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "7 existing vulnerabilities detected",
                "points": 2.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "good",
            "name": "Dependency advisories",
            "note": "Matched the npm:@waits/cadence@0.13.0 runtime dependency closure — what installing the published package pulls in — 274 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "npm:@waits/cadence@0.13.0",
                  "assessed": 274
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 84,
            "inputs": {
              "source": "osv",
              "advisories": 2,
              "affected_packages": 2,
              "assessed_packages": 274,
              "unassessed_packages": 0,
              "affected_by_severity": "high 1, low 1",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "2 affected: ws 8.20.1 (high 7.5), esbuild 0.28.0 (low 2.5)",
                "points": 9.4,
                "status": "partial",
                "details": [
                  {
                    "code": "advisories_affected",
                    "params": {
                      "count": 2,
                      "packages": "ws 8.20.1 (high 7.5), esbuild 0.28.0 (low 2.5)"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory has been public longer than 90 days",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "advisories_none_stale",
                    "params": {
                      "days": 90
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 274,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 2
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 63,
        "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": 1,
              "agent_instruction_files": [
                ".cursor/rules/cadence.mdc"
              ],
              "agent_instruction_max_bytes": 23360
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": ".cursor/rules/cadence.mdc",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".cursor/rules/cadence.mdc"
                    }
                  }
                ],
                "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": "100 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 100,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "at_risk",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 33,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "tsconfig.json"
              ],
              "agent_commit_share": 0,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": 13384,
              "source_files_sampled": 125,
              "oversized_source_files": 0
            },
            "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": "0/125 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 125,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-27T13:13:58.616912Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/r/ryanwaits/cadence.svg",
  "full_name": "ryanwaits/cadence",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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