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

noriq-dev / runner

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

noriq-dev/runner має індекс здоров’я 48 зі 100, що відповідає смузі «У зоні ризику». Найвищий показник — AI Readiness (79/100), найнижчий — Sustainability & Governance (32/100). Останнє оновлення було 6 днів тому. Більшість нещодавньої роботи виконує один учасник.

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

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

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

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

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

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

Власність

Noriq.devОрганізація
0 підписників3 публічні репозиторіїз лип. 2026 р.

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

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

РеєстрПакетВерсіяЗавантажень / місВерсіїОстання публікаціяТеги
npm@noriq-dev/runner0.13.23 136206 днів томуnoriqagentsclaudecodexcoding-agentdaemoncli

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

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

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

68Помірний · 22% загального індексу
Як обчислюється оцінка
36/36Свіжість push — останній push 6 дн. тому
1.4/36Ритм комітів — 2/52 тижнів із комітами
18/18Обсяг комітів — 128 комітів за останній рік
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Використані вхідні дані
commits_last_year128
human_commit_share1
days_since_last_push6
active_weeks_last_year2
Як обчислюється оцінка
16.2/27Випускає релізи — 18 тегів версій (без релізів GitHub)
36/36Свіжість релізів — останній реліз 6 дн. тому
27/27Ритм релізів — реліз кожні ~0,4 дн.
0/10OpenSSF Scorecard: Signed-Releases — немає даних
Використані вхідні дані
releases_count18
latest_release_tagv0.13.2
releases_from_tagsтак
days_since_latest_release6
mean_days_between_releases0,4
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: Signed-Releases. Залишкові ваги перенормовано.

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

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

32У зоні ризику · 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ні
Як обчислюється оцінка
46.6/80Щомісячні завантаження — 3 136 завантажень/місяць у npm
0/20Залежні пакети в реєстрі — ця екосистема цього не повідомляє
Використані вхідні дані
packages@noriq-dev/runner
dependents
ecosystemsnpm
total_downloads
monthly_downloads3 136
Виключено з оцінювання (немає даних або не застосовно): Залежні пакети в реєстрі. Залишкові ваги перенормовано.

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

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

32У зоні ризику · 24% загального індексу
Як обчислюється оцінка
9/54Бас-фактор — на 1 контриб’ютор(ів) припадає половина всіх комітів
0/22.5Розподіл комітів — головний контриб’ютор — автор 100% комітів
1.4/13.5Широта контриб’юторів — 1 контриб’юторів
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Використані вхідні дані
bus_factor1
contributors_sampled1
top_contributor_share1
Як обчислюється оцінка
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. Залишкові ваги перенормовано.

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

34У зоні ризику
Як обчислюється оцінка
30/30Підтримка власника — у власності організації
0/20Верифікований домен
0/25Охоплення власника — 0 підписників у noriq-dev
4.4/25Послужний список — 3 публічних репозиторіїв, вік облікового запису ~0 р.
Використані вхідні дані
followers0
owner_typeOrganization
is_verified
owner_loginnoriq-dev
public_repos3
account_age_days12

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

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

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

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

60Помірний · 20% загального індексу
Як обчислюється оцінка
24/24Процеси CI — 2 процес(ів) CI
24/24Наявні тести
16/16Конфігурація лінтера — biome.json
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У зоні ризику
Як обчислюється оцінка
30/30README
0/25Каталог документації
0/15Сайт документації / домашня сторінка
0/10Опис репозиторію
0/10Теми
0/10Wiki
Використані вхідні дані
topics
has_wikiні
homepage
has_readmeтак
has_docs_dirні
has_descriptionні

Безпека

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

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

Стан безпеки

34У зоні ризику
Як обчислюється оцінка
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/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Ліцензія — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
5/5Packaging — packaging workflow detected
1/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 2
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
6/7.5Vulnerabilities — 2 existing vulnerabilities detected
Використані вхідні дані
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate3,4
Виключено з оцінювання (немає даних або не застосовно): ci_tests, signed_releases. Залишкові ваги перенормовано.
Як обчислюється оцінка
35/35Прямі залежності без відомих сповіщень — жодна пряма залежність не має відомих сповіщень
25/25Непрямі залежності без відомих сповіщень — жодна непряма залежність не має відомих сповіщень
0/40Немає задавнених сповіщень — жодне сповіщення не має дати публікації
Використані вхідні дані
sourceosv
advisories0
affected_packages0
assessed_packages12
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Виключено з оцінювання (немає даних або не застосовно): Немає задавнених сповіщень. Залишкові ваги перенормовано. Звірено з runtime-замиканням залежностей npm:@noriq-dev/runner@0.13.2 — тим, що тягне за собою встановлення опублікованого пакета, — 12 пакетів. Досяжність не аналізується.

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

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

79Добрий · 0% загального індексу
Як обчислюється оцінка
45/45Інструкції для агентів — CLAUDE.md
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 76 з 100 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share0,76
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes9 890
Як обчислюється оцінка
0/18Розгортання однією командою
22/22Автоматизовані тести
11/11Конфігурація лінтера / форматера — biome.json
11/11Статична перевірка типів — tsconfig.json
10/10Відтворюване середовище — lockfile
10/10Підтверджена практика роботи з агентами — 81 з останніх 100 комітів створено агентом або з його зазначенням
0/8Автоматизоване супроводження — автоматичних оновлень залежностей не виявлено
2/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 2
Використані вхідні дані
has_nixні
has_testsтак
lockfilespackage-lock.json
has_dockerfileні
typed_languageтак
bootstrap_files
has_devcontainerні
has_linter_configтак
typecheck_configstsconfig.json
agent_commit_share0,81
toolchain_manifests
dependency_bot_commit_share0
Як обчислюється оцінка
45/45Типізований код — TypeScript (статично типізована)
53.9/55Керовані розміри файлів — 2/102 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languageTypeScript
largest_source_bytes142 651
source_files_sampled102
oversized_source_files2

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

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

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

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

Докладніше

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

Незалежна, не прив'язана до інструментів оцінка безпеки від відкритого проєкту OpenSSF Scorecard. Кожна перевірка винагороджує практику безпеки, а не інструмент конкретного постачальника. Перевірки, які Scorecard не зміг визначити, позначено н/д і виключено з оцінки безпеки (вони ніколи не зараховуються як нуль).Scorecard v5.5.0 · 2026-07-27 13:10 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
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
10Packagingpackaging workflow detected
2Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 2
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
н/дSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
8Vulnerabilities2 existing vulnerabilities detected
Прямі залежності 4
РеєстрПакетОбмеження версіїМаніфест
npm@anthropic-ai/claude-agent-sdk^0.3.0package.json
npmsmol-toml^1.3.1package.json
npmws^8.21.1package.json
npmzod^4.0.0package.json
Усі залежності не зібрано

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

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

Встановлення npm:@noriq-dev/runner@0.13.2 тягне 12 пакетів, прямих і транзитивних: 0 мають відомі сповіщення, з них 0 — прямі залежності.

Жодне відоме сповіщення не стосується оцінених залежностей.

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

Звіт у форматі JSON машиночитний
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 1616,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "JavaScript": 16414,
        "TypeScript": 1106563
      },
      "pushed_at": "2026-07-20T20:43:48Z",
      "created_at": "2026-07-14T19:47:05Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-20T20:43:52Z",
      "description": null,
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript"
      ]
    },
    "owner": {
      "blog": "https://noriq.dev/",
      "name": "Noriq.dev",
      "type": "Organization",
      "login": "noriq-dev",
      "company": null,
      "location": "United States of America",
      "followers": 0,
      "avatar_url": "https://avatars.githubusercontent.com/u/305059202?v=4",
      "created_at": "2026-07-14T19:46:34Z",
      "is_verified": null,
      "public_repos": 3,
      "account_age_days": 12
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.13.2",
          "kind": "patch",
          "published_at": "2026-07-20T20:43:46Z"
        },
        {
          "tag": "v0.13.1",
          "kind": "patch",
          "published_at": "2026-07-20T20:11:01Z"
        },
        {
          "tag": "v0.13.0",
          "kind": "minor",
          "published_at": "2026-07-20T19:41:43Z"
        },
        {
          "tag": "v0.12.0",
          "kind": "minor",
          "published_at": "2026-07-20T15:23:09Z"
        },
        {
          "tag": "v0.11.0",
          "kind": "minor",
          "published_at": "2026-07-20T01:35:46Z"
        },
        {
          "tag": "v0.10.1",
          "kind": "patch",
          "published_at": "2026-07-18T22:18:53Z"
        },
        {
          "tag": "v0.10.0",
          "kind": "minor",
          "published_at": "2026-07-18T20:08:43Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-07-17T20:36:20Z"
        },
        {
          "tag": "v0.7.1",
          "kind": "patch",
          "published_at": "2026-07-17T07:50:17Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-07-17T06:48:00Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-07-17T03:34:00Z"
        },
        {
          "tag": "v0.5.3",
          "kind": "patch",
          "published_at": "2026-07-17T02:11:27Z"
        },
        {
          "tag": "v0.5.2",
          "kind": "patch",
          "published_at": "2026-07-17T01:26:52Z"
        },
        {
          "tag": "v0.5.1",
          "kind": "patch",
          "published_at": "2026-07-17T00:41:53Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-07-17T00:02:43Z"
        },
        {
          "tag": "v0.4.1",
          "kind": "patch",
          "published_at": "2026-07-16T22:38:38Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-07-16T21:19:01Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-07-16T19:58:09Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "6a9d9ada6fd2846aefc5cb5d1dfe42e0ed8e2adb",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.13.2",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-20T20:43:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a8cdbad1e54c4a4e2b08d1b2b280fb3bba6aab29",
          "body": "…5 wire shape\n\nTwo problems with RUN-125, found in live integration testing (v0.13.1 + planar main):\n1. It sent registration `repos[].workflows: {name,base}[]`, but planar's RunnerRepo.workflows\n   is z.array(z.string()) — RegisterRunnerBody.safeParse rejects objects, 400-ing the WHOLE\n   registrati\n[…]\n to planar — now byte-identical, RUN-122\nport loop closed. PLANAR-PORT.md updated to the reconciled state. Full check green (790).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(RUN-126): workflow posture is daemon-authoritative; revert RUN-12…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-20T20:43:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "357ccdc467c490bb9f58edbaccfc2a66890c9ec8",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.13.1",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-20T20:11:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b9948f9c2125189038bd5111acaaa9b5538dabeb",
          "body": "…nd, not just its name\n\nA custom workflow's permission POSTURE comes from its `base` kind — the supervisor enforces\npermissions off `run.kind`, and `run.workflow` overrides only the prompt. Registration used to\nadvertise `repos[].workflows: string[]` (names only), so the dashboard couldn't derive th\n[…]\nasserts\nthe name+base shape. PLANAR-PORT.md updated: planar `RunnerRepo.workflows` must carry `base` too.\n\nFull check green (789).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-125): registration advertises each custom workflow's base ki…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-20T20:07:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c1036fe3770de15fd9d940454581c95384954d8a",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.13.0",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-20T19:41:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e2ca82dc040df3c5e7cf5c74f302c2daccdf3701",
          "body": "…recation window\n\nPhase 5 — cutover prep. No functional runner change; the runner half of the plan is\ncomplete and fully back-compatible.\n\n- RUN-122: PLANAR-PORT.md enumerates the exact vendored→planar shared deltas\n  (coordinate + workflow fields, registration agents[]/repos[].workflows) plus the\n \n[…]\ngent-coordinate.test pins the legacy⟷coordinate\n  equivalence; PLANAR-PORT.md records the removal target.\n\nFull check green (788).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(RUN-122/123/124): contract port manifest, invariant updates, dep…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-20T19:36:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "32b5716b26fbaaa22fb0ef1acbd69e05acda37b6",
          "body": "…riants of a kind\n\nPhase 4. A repo can declare [workflow.<name>] blocks: a named variant of a built-in\nkind that inherits its floor-safe posture and swaps in its own prompt.\n\n- RUN-119: shared WorkflowDef {base, prompt} + ProjectManifest.workflows; resolveWorkflow\n  resolves a built-in kind id or a \n[…]\nanifest.workflows / Run.workflow authored in the VENDORED\ncopy with PENDING-PLANAR-PORT markers (RUN-122). Full check green (784).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-119/120/121): configurable workflows — repos define named va…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-20T19:32:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "651c35103fa7a097bfcc95c26c4df9913f8269fa",
          "body": "…tch becomes a descriptor\n\nPhase 3, behavior-preserving. The run \"kind\" stops being a switch scattered through\nthe supervisor and becomes a Workflow descriptor the supervisor reads.\n\n- RUN-116: src/workflow.ts — Workflow {promptShape, worktreeWritable, produces,\n  verifyActor, usesPlanBase} + BUILTI\n[…]\nwrite = true. \"Verify\n  executes but never edits\" is now code, not an honor system. THREAT-MODEL updated.\n\nFull check green (777).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-116/117/118): workflows as data — the scope/build/verify swi…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-20T19:21:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0c51fccf437f78e74f0f0a2facae8d98f4197677",
          "body": "…ffort triple\n\nPhase 2. One dotted coordinate — `claude.opus-4_8.high` — is the canonical agent\nselector; the legacy triple is kept, derived, for one deprecation window.\n\n- RUN-112: src/agent-coordinate.ts — parse/format/merge over `<tool>.<model>.<effort>`,\n  with `.`↔`_` model escaping, partials, \n[…]\nhem into planar and\nfiles the dispatch/dashboard companions. vendor:shared must NOT run before that port.\n\nFull check green (768).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-112/113/114/115): agent coordinates replace the tool/model/e…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-20T19:12:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cff0da66cf69548a7843945516b850d0b799ae6d",
          "body": "… descriptor, vendor-name purge\n\nPhase 1 of the driver-seam generalization. Makes AgentDriver the clean, self-describing\nboundary the coordinate + workflow work builds on.\n\n- RUN-109: env sanitization becomes a SUPERVISOR guarantee. `DriverStartOptions.env` carries\n  the stripped child env, computed\n[…]\n/steering/budget); a guard test proves lock enforcement keys off the capability,\n  not the driver's name.\n\nFull check green (742).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-109/110/111): harden the driver seam — env hoist, capability…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-20T18:48:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "43b604a95b077f2e0de130f9e5b77aa08348814f",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.12.0",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-20T15:23:09Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "19790f2c67673970bb96b262b5f38b88e94ab9a3",
          "body": "`noriq-runner <TAB>` now completes commands, per-command flags, and enum\nflag values. A hidden `completion <bash|zsh>` prints a sourceable script that\ndelegates back to a hidden `__complete` command, so the candidate list lives\nin TS next to parseArgs and never drifts from a hand-maintained copy.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-108): shell tab-completion for the CLI (bash + zsh)",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-20T15:00:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "dac768aebe5b4f82911bdd09f577bc4b10c65f9e",
          "body": null,
          "is_bot": false,
          "headline": "v0.11.0",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-20T01:35:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b07fb6c821141e5f562e0adda0edc8275f459bed",
          "body": "Phase 6 (final) of runner-enforced file locking.\n\nRUN-106: lock holds/denials/gates surface in the run view via the RUN-74\ntranscript pipeline (no wire change) — a reactive deny, a hard-floor\ngate, and a predictive refuse each emit a 🔒 milestone naming the paths\nand holders, so a human watching sees\n[…]\nan, and the pass criteria. The\nlive run is a manual step (credentials + server + spend), like\nDOGFOOD.md.\n\nFull suite green (725).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-106/107): lock telemetry in the run view + dogfood runbook",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-20T01:33:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e85a655e3344578d9a58ad3ac6261f7680eb2038",
          "body": "…erge\n\nPhase 5 of runner-enforced file locking. Largely delivered by the\narchitecture of Phases 2-4 and made explicit here:\n\n- Cross-worktree coordination is inherent: locks live server-side (the\n  Noriq view), so two runs on one repo — each in its own worktree — see\n  each other's holds. The hard f\n[…]\nlocked, cross-target stays git-merge's job. Tests pin the land→release\nordering and cross-worktree gating; full suite green (724).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-105): worktree/branch lock coordination — hold through the m…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-20T01:30:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2cd7ed96651c60697bba79ab2464935af3f73820",
          "body": "Phase 4 of runner-enforced file locking.\n\nRUN-103 (predictive): with a DECLARED scope, the daemon takes its locks\nas the run's holder right after minting the run agent — before the agent\nstarts — and REFUSES a dispatch whose scope clashes (dispose the lease,\nfail with the conflict), rather than raci\n[…]\nich settles their tasks, which releases their locks\nserver-side; TTL is the final backstop.\n\n19 new tests; full suite green (722).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-103/104): dispatch-time predictive locking + terminal release",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-20T01:27:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2bc92cfb4f4c05daef2e12fb49a180c438631176",
          "body": "Phase 3 of runner-enforced file locking.\n\nRUN-101 (reactive per-edit hook): src/lock-hooks.ts ports the PLNR\nhook's path extraction and adds a driver-agnostic LockEnforcer. The\nClaude driver wires it as in-process PreToolUse (deny an edit to a\npeer-held path) + Stop (release) hooks via the SDK's hoo\n[…]\nlive-backend native locks apply\nper-edit too. Scope branch = the landing target (RUN-97 §5). 35 new\ntests; full suite green (715).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-101/102): guaranteed lock enforcement in spawned agents",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-20T01:20:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "aa11705d56c8cef6d7781c90c14e76ead7676d86",
          "body": "Phase 2 of runner-enforced file locking. Adds lock/unlock/queryLocks to\nthe VcsBackend seam (optional — a backend with no lock layer omits them,\ncallers treat absence as 'no enforcement here', like checkClaimable).\n\n- LockClient (src/lock-client.ts): MCP-over-HTTP for the four Noriq lock\n  tools, au\n[…]\nds.\n\nBranch scope = the run's landing target, not its throwaway worktree\nbranch (RUN-97 §5). 26 new tests; full suite green (694).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-98/99/100): file-lock capability on the VcsBackend seam",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-20T01:03:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a59e1b50d76304be4d2d4e9eb0356f3363eb6f5e",
          "body": null,
          "is_bot": false,
          "headline": "v0.10.1",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-18T22:18:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "298a2e24ecd7dee37f6321426393963e26d4a7bc",
          "body": "…ibution moves to the body\n\n'noriq run <id>: <label>' made every agent commit read identically in\none-line history — the id nobody scans pushed the task key/title\neverybody scans off the right edge. Subject is now the label (task key\n+ title, brief, 'landing fix', …); 'noriq run <id>' rides the body\n[…]\nMessage) for all three checkpoint sites. Perforce\nchangelist descriptions keep their exact 'noriq run <id>' marker — the\nreap parses that shape.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(RUN-96): checkpoint commits lead with WHAT changed; runner attr…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-18T22:17:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "078c331c94be0799cf2b33a835dd3916a5b1faf8",
          "body": "…ormalized spelling\n\ngit porcelain prints forward slashes where the daemon builds platform\nones, so worktreeRegistered's verbatim compare read a registered\nworktree as absent on Windows and the adopt path ran 'worktree add'\ninto its own checkout — every Windows continue failed, and windows CI\nwith it (red since v0.9.0). comparableWorktreePath unifies slashes,\nrealpaths the 8.3/long split where the path exists, and case-folds on\nwin32.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(RUN-95): Windows continue-run adopt — compare worktree paths by n…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-18T20:08:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3a2c3eb7bd333fface0e83d4ae3f8a59fc32ba2b",
          "body": null,
          "is_bot": false,
          "headline": "v0.10.0",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-18T19:44:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7c17a755b86929ef79f9ec2a04ea0b98cdda6840",
          "body": "… becomes a committed knob\n\nRUN-29's fail→fix→re-verify loop was bounded by a hardcoded K=2; a repo\ncould neither widen it (long-tail suites) nor narrow it to a pure gate.\nSame shape as [verify.agent].maxRounds: int 0–5, default 2 (unchanged\nbehavior), 0 = verdict only, no hand-back. Applies whereve\n[…]\ncks the real bound. noriq init asks for it alongside\nshell/timeout; shared schema vendored from planar branch\nnoriq/verify-max-rounds (783f835).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-94): [verify] maxRounds — the deterministic floor's fix loop…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-18T19:07:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "49500e76719d7a8d5902cf5aa44217931bbc8924",
          "body": null,
          "is_bot": false,
          "headline": "v0.9.0",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T20:36:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bb4d9449e1e987ef3f049a47fa1f689bbd4fe053",
          "body": "…e adopts the run's work\n\nRUN-91 made a continue reuse the kept worktree, but only for git\n(worktree.ts adopts an existing run-branch). On the server-backed\nbackends a re-dispatch of the same run id would fail — and Montana's\nPrototype dogfooding runs on Diversion. The uniform contract is now\n\"lease\n[…]\ne Perforce path warrants a live-p4d confirmation before\nheavy reliance; the primitives are the measured ones, the ordering is new.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-93): continue on server-backed VCS — Diversion/Perforce leas…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T20:25:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f9a429f577b3231ef3a3549d818bd283ecf9e77e",
          "body": "…ion ledger\n\nFollow-up to RUN-91. RUN-91 adopts the kept worktree, but the runner's\nper-run state is in-memory and gone once a run terminates, so a\ncontinuation lost two continuities:\n\n- SPEND: a fresh RunTally reported only this sitting's tokens/usd, and\n  recordRunTelemetry (COALESCE takes the fra\n[…]\nund 1, the persist-on-fail / clear-on-pass lifecycle, and the\nstore's on-disk round-trip + corrupt-file degrade. Full check green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-92): continuation continuity — re-seed spend + the adjudicat…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T20:17:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ffa07b449978c5d1e9433b1fb7c474facc0d5627",
          "body": "…budget.maxRounds\n\nThe runner half of \"continue a failed run\" (server + UI is PLNR-180). A\ngate-failed build is kept, not disposed, so its branch and worktree\nsurvive on disk; the server re-dispatches the SAME run id with\nbudget.maxRounds set, and — per the contract — \"resume\" is inferred by\nthe dae\n[…]\n,\nbut a fixed finding refutes against the kept tree), and continue on the\nserver-backed VCS backends (adoption is git-only today).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-91): continue a failed run — adopt the kept worktree, spend …",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T18:54:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9d7db9b30f0ae85231831dd54eeed64f1fdb17ef",
          "body": "The vendored contract had drifted since planar's RUN-59 server work:\n`RunModelMix`/`RunModelUsage` were name-swapped (runner had Usage=value,\nMix=map; planar has Mix=value, Usage=map), and planar had since added\nUNATTRIBUTED_MODEL_ID, the '(un)attributed' bucket doc, the 'failed'\ntask status, a `mod\n[…]\nly writes the mix via telemetry, so its test literal is null.\n\nTest budget literals carry maxRounds; full check green (655 tests).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(RUN-87): refresh vendored @noriq-dev/shared from planar main",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T18:41:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8ac0e506e9d44f03254c1b77874ac850352e0cb0",
          "body": "The RUN-66 run failed after both fix rounds over eight findings that\nwere all one invariant (\"Enter-through is a no-op\") leaking through\neight unlike mechanisms. The builder patched sites one at a time; the\nreviewer enumerated the family faster than the round budget could close\nit — structural non-c\n[…]\nmechanisms + one named broken\npromise) so it stays a disciplined finding, not a \"feels systemic\"\nescape hatch. Prompt tests green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-90): reviewer names the invariant-class, not N instances",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T16:13:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "40e8adbaa6fef2998981e43594772a16d0843e07",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.8.0",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T08:34:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2cc6a10ca597bb6891ec4e7467af4c3165b03a89",
          "body": "…class costs one number\n\nBoth RUN-66 and RUN-88 died in the TERMINAL review — the one with no fix\nbudget behind it — on findings raised there for the first time, both\n[medium], neither ever fixable or contestable by the builder.\n\nThe revert test. RUN-76 already said pre-existing code is \"not this\nau\n[…]\nrchitectural pivot in two\nrounds. It should now fail in round 1 with the cause named rather than\nburn three rounds discovering it.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-89): the reviewer's scope test is mechanical, and a finding …",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T08:34:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "992035367bd3b19a248a6b1a81cb20feeae6f64c",
          "body": "The runner landed RUN-65 (\"Advanced permissions: curate the build\nallowlist and network — never the floor\") on the plan branch, plus its\nreviewer fix round. It adds a [permissions] advanced section, the\n`defaultBranch` identity section, and 30 tests.\n\nConflicts were both additive (ManifestChoices fi\n[…]\nator is asked about a stream. Pinned by assertions in\nthe Perforce flow test.\n\n625 → 655 tests (RUN-65's 30), npm run check green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Merge RUN-65 (advanced permissions) from the curated-marker plan branch",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T07:59:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "48e96aa0de082282a294b5d556f683c56a841734",
          "body": null,
          "is_bot": false,
          "headline": "v0.7.1",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T07:50:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "48cdec5228feac1de660549e3d451e76897daf51",
          "body": "…t, not \"not reported\"\n\nRunTally made a run's model mix all-or-nothing (RUN-59): one spending\nsession with no per-model attribution dropped the WHOLE mix. With\n[verify.agent] tool = codex, every build spawns a codex reviewer, and\ncodex reports tokens with no per-model split and no cost — so a Claude\n[…]\nv/shared (drivers/types.ts) and pinned by a test until the\nvendored slice is refreshed (RUN-87); the dashboard render is PLNR-179.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-86): fold un-attributable spend into an (unattributed) bucke…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T07:47:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d27c4158bd9621440e6666c0f0e7a145d23cce81",
          "body": "…tion\n\nThe guided marker detected a Diversion workspace but still asked to land\nthe \"rebased\" result, to resolve \"rebase\" conflicts, to \"push\" to a\n\"remote\", warned about `git log origin/main..main`, and closed with\n`git add && git commit` — none of which fit a backend with no rebase,\nwhose publish \n[…]\nway. Git renders byte-for-byte as before — it is the\ndetection fallback.\n\nDaemon-side MR flow is still git+gh — tracked as RUN-85.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-84): init-project speaks the detected VCS, not git-by-assump…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T07:24:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1a499d605b354c801e60548ae05fc480912f3d04",
          "body": null,
          "is_bot": false,
          "headline": "noriq run run_mroll8m25i054d5l5w70: reviewer fix round 1",
          "author_name": "Noriq Runner",
          "author_login": null,
          "committed_at": "2026-07-17T07:21:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fb2b095518f7391b59c9a6a2e2d8779b45cf6efd",
          "body": "…te the build allowlist and network — never the floor",
          "is_bot": false,
          "headline": "noriq run run_mroll8m25i054d5l5w70: RUN-65 Advanced permissions: cura…",
          "author_name": "Noriq Runner",
          "author_login": null,
          "committed_at": "2026-07-17T07:15:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a69d6bf18ea57b15c39fb8fe2cf0d1d001b85573",
          "body": "Merges the curated-init-project plan (RUN-56 rework, RUN-62/63/64 --advanced\noptions + per-kind [defaults], RUN-59 model-usage telemetry) with the reviewer-\ngate + daemon work landed since 0.6.0 (RUN-78 workspace-boundary rule, RUN-79\nadjudication ledger, RUN-81 phase-gate backstop, RUN-82 plan-branch fork base,\nRUN-83 task-lifecycle owned by the run).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.7.0",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T06:48:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a0089cf3c5a341209e3bb214fbd6ad6da606eb22",
          "body": "# Conflicts:\n#\tsrc/supervisor.ts",
          "is_bot": false,
          "headline": "Merge branch 'noriq/plan-the-curated-marker-init-project--3l5257'",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T06:42:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "17c460349b3999fc1b2a4a232b36d065633ca075",
          "body": "A build agent called release_task(review) when it finished, BEFORE the daemon's\nverify/reviewer gate ran. A gate FAILURE then left the task stranded in `review`,\nindistinguishable from work genuinely awaiting a human. The task's lifecycle\nbelongs to the run's terminal outcome, not the agent.\n\nDroppe\n[…]\nInert on its own — the server counterpart (transitionRun authoritative + a new\n`failed` task status) lands alongside in planar. 566 tests green.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(RUN-83): build agent no longer moves its anchor task — the run does",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T06:13:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9066c742fad4882137863dbdd42b4720ecb7b4c7",
          "body": "A runner agent hit this on RUN-64: its worktree forked from HEAD (main) while the\ntasks it built on (RUN-62/63) had landed only on the plan branch, so it could not\nsee the work it depended on and had to mirror the plan branch's files by hand. The\nreview diff then double-counted the predecessors and \n[…]\nre you land), but such runs' review/verify diffs become \"vs the integration\nbranch\" rather than \"vs main\".\n\n566 tests green (+6); bundle builds.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(RUN-82): fork a plan run's worktree from the [land] branch, not main",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T06:00:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7a11618d61f5cede5536b60252af38184da40a24",
          "body": "…ble task\n\nRUN-59 (phase 1 of a plan) passed the verifier into REVIEW — not done/approved —\nso phase 2 should have stayed locked. The runner spawned an agent on a phase-2\ntask and continued. The primary cause is server-side (removing plan-task\ndependency edges left claim_task to enforce phase order,\n[…]\ns to report the gate the running agent's own claim would skip.\n\n560 tests green (5 supervisor gate cases + 4 client probe cases); bundle builds.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(RUN-81): daemon phase-gate backstop — don't spawn on a non-claima…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T05:14:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e4f5a7effb76d7703872f65947f5965373ad4c88",
          "body": "… `[land]` envelope, one typed answer at a time",
          "is_bot": false,
          "headline": "noriq run run_mrofmeas5x305d1s483q: RUN-64 Advanced landing: walk the…",
          "author_name": "Noriq Runner",
          "author_login": null,
          "committed_at": "2026-07-17T04:46:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f24eaf5a2466344979073f2d5f9a3b0db99b06d9",
          "body": null,
          "is_bot": false,
          "headline": "noriq run run_mrof7aay3v3q0d4a2g5m: reviewer fix round 1",
          "author_name": "Noriq Runner",
          "author_login": null,
          "committed_at": "2026-07-17T04:25:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "633a31078cff07c9f9a41f22c0dd73a438e075de",
          "body": "…hell pin, timeout, reviewer effort & rounds",
          "is_bot": false,
          "headline": "noriq run run_mrof7aay3v3q0d4a2g5m: RUN-63 Advanced verify options: s…",
          "author_name": "Noriq Runner",
          "author_login": null,
          "committed_at": "2026-07-17T04:25:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2c7ba619e6688088379c202ccd1b481b9cabe665",
          "body": "… the fork, plus per-kind `[defaults]` model & effort",
          "is_bot": false,
          "headline": "noriq run run_mrof7a1y0i4y2m3l024z: RUN-62 `init-project --advanced`:…",
          "author_name": "Noriq Runner",
          "author_login": null,
          "committed_at": "2026-07-17T04:22:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "df3388807b6b00769433597386cb1e5976b99ab6",
          "body": "…op clumping\n\nRUN-77 made intra-turn text byte-faithful (verified live: the vendored CLI\ndelivers text_delta with newlines intact). The remaining clump was BETWEEN\nturns: distinct assistant responses separated by tool calls carry no newline\n— the model never emits one — so raw concatenation reads\n\"…\n[…]\ny byte-exact —\nthe break is inserted at the source of truth for boundaries and rendered by\nthe dashboard's breaks-aware markdown as a paragraph.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(RUN-80): paragraph break between assistant turns — transcripts st…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T04:20:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "df27320c6cbc34d0d72d3734a3296ecbe3e66c7a",
          "body": null,
          "is_bot": false,
          "headline": "noriq run run_mrodyo5g0b4x515k1z17: reviewer fix round 1",
          "author_name": "Noriq Runner",
          "author_login": null,
          "committed_at": "2026-07-17T04:10:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a6bcef62a1c6cc8f71ba599f41cd413925c84ae2",
          "body": "…models it ACTUALLY used, not just which one was asked for",
          "is_bot": false,
          "headline": "noriq run run_mrodyo5g0b4x515k1z17: RUN-59 A run should report which …",
          "author_name": "Noriq Runner",
          "author_login": null,
          "committed_at": "2026-07-17T04:10:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "99326878260b036bbeae39463e0927e0438415d4",
          "body": "Reviewer gate hardening: workspace-boundary rule (RUN-78) — cross-repo/service\nrequirements are follow-up, not findings; and the cross-round adjudication ledger\n(RUN-79) — prior findings + the builder's pointer-based rebuttal ride to each fresh\nreviewer, so a settled finding is verified, not relitigated.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.6.0",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T04:10:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a8e643f756022e9cbdd9855dad3dde4926bcf0d9",
          "body": "… being relitigated\n\nEvery reviewer round is a fresh, stateless session by design (RUN-61) — but total\namnesia also erased what was already ADJUDICATED, so runs re-raised findings the\nbuilder had already answered with evidence (RUN-56 twice, RUN-59's cross-repo P1\nafter two rebuttals). The builder i\n[…]\nof scope: no third-party adjudicator, no FAIL-vote de-duplication,\nmaxRounds untouched — all tracked for after this + RUN-78 measure in dogfood.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-79): cross-round adjudication ledger — settled findings stop…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T04:10:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "08114413258d7948b45093c7b4c4d8a7ce15abda",
          "body": "…not findings\n\nRUN-76 scoped the gate to the diff, but when the intent itself names deliverables\nthat live outside this tree, the prompt gave no rule and fresh reviewers split on\nit. RUN-59 dogfood: rounds 1/3 FAILed a run over a D1 migration + dashboard UI the\nrunner repo can never carry (it is sta\n[…]\nes elsewhere.\n\nRationale on the call sites; tests assert the boundary language and its\nparticipation carve-out in both prompts. 526 tests green.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(RUN-78): reviewer/verify gate — cross-workspace requirements are …",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T04:10:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "46d9fabf401ac1817d19b2126e93a123291b8fef",
          "body": "RUN-77 (56b9bd3 / 2640225) landed new test lines over the 110-col limit; both\nits CI runs failed the biome format gate and were pushed to main anyway, so\nmain has been red since. Pure line-wrapping — no tokens or assertions change.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: biome-format RUN-77's test additions (main was red)",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T04:10:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0fe977b398311650d6242fc1bac292c62a39517f",
          "body": "Codex was already correct — its only text source is the raw\nagentMessageDelta stream, with no assembled-message path to drop newlines\n(unlike claude before this task). Add a parity test that concatenates\ndeltas split mid-word and at newline boundaries and asserts the model's\nbytes survive exactly, so a future refactor can't regress it silently.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(RUN-77): pin codex transcript byte-faithfulness (newlines intact)",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T04:10:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fc23bafdc533bc7849400080f59db5daaf553c73",
          "body": "…'s newlines\n\nThe claude driver built transcript text from each assembled `assistant`\nmessage via extractText, which joins content blocks with '' and drops the\nnewlines the model put between them. Invisible in one-line prose, but it\ncollapsed a whole bulleted review into a single paragraph on the da\n[…]\named, so a transport without\npartial messages (and the existing tests) behave unchanged. thinking_delta\nis filtered out — it is not agent prose.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(RUN-77): stream raw text deltas so the transcript keeps the model…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T04:10:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "985c2fed5442a8bce7378e456955d0cc4b69faa4",
          "body": "…op clumping\n\nRUN-77 made intra-turn text byte-faithful (verified live: the vendored CLI\ndelivers text_delta with newlines intact). The remaining clump was BETWEEN\nturns: distinct assistant responses separated by tool calls carry no newline\n— the model never emits one — so raw concatenation reads\n\"…\n[…]\ny byte-exact —\nthe break is inserted at the source of truth for boundaries and rendered by\nthe dashboard's breaks-aware markdown as a paragraph.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(RUN-80): paragraph break between assistant turns — transcripts st…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T04:01:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7e4ccf9fc700e1d72e74610973417883b244dffd",
          "body": "Reviewer gate hardening: workspace-boundary rule (RUN-78) — cross-repo/service\nrequirements are follow-up, not findings; and the cross-round adjudication ledger\n(RUN-79) — prior findings + the builder's pointer-based rebuttal ride to each fresh\nreviewer, so a settled finding is verified, not relitigated.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.6.0",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T03:34:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1d2d60c3c7d8c1a09e90487351e4100a9bcddb24",
          "body": "… being relitigated\n\nEvery reviewer round is a fresh, stateless session by design (RUN-61) — but total\namnesia also erased what was already ADJUDICATED, so runs re-raised findings the\nbuilder had already answered with evidence (RUN-56 twice, RUN-59's cross-repo P1\nafter two rebuttals). The builder i\n[…]\nof scope: no third-party adjudicator, no FAIL-vote de-duplication,\nmaxRounds untouched — all tracked for after this + RUN-78 measure in dogfood.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-79): cross-round adjudication ledger — settled findings stop…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T03:33:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4f79f35bde687db23905baf713e0daa066ae1d7a",
          "body": "…not findings\n\nRUN-76 scoped the gate to the diff, but when the intent itself names deliverables\nthat live outside this tree, the prompt gave no rule and fresh reviewers split on\nit. RUN-59 dogfood: rounds 1/3 FAILed a run over a D1 migration + dashboard UI the\nrunner repo can never carry (it is sta\n[…]\nes elsewhere.\n\nRationale on the call sites; tests assert the boundary language and its\nparticipation carve-out in both prompts. 526 tests green.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(RUN-78): reviewer/verify gate — cross-workspace requirements are …",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T03:17:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "48906e169308f67d965215615668e4b130b14d06",
          "body": "RUN-77 (56b9bd3 / 2640225) landed new test lines over the 110-col limit; both\nits CI runs failed the biome format gate and were pushed to main anyway, so\nmain has been red since. Pure line-wrapping — no tokens or assertions change.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: biome-format RUN-77's test additions (main was red)",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T03:17:20Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2640225981c826f4d06a42372aab85c4168627db",
          "body": "Codex was already correct — its only text source is the raw\nagentMessageDelta stream, with no assembled-message path to drop newlines\n(unlike claude before this task). Add a parity test that concatenates\ndeltas split mid-word and at newline boundaries and asserts the model's\nbytes survive exactly, so a future refactor can't regress it silently.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(RUN-77): pin codex transcript byte-faithfulness (newlines intact)",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T02:31:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "56b9bd305dce74809722b64b5d45965fe4d5c7a3",
          "body": "…'s newlines\n\nThe claude driver built transcript text from each assembled `assistant`\nmessage via extractText, which joins content blocks with '' and drops the\nnewlines the model put between them. Invisible in one-line prose, but it\ncollapsed a whole bulleted review into a single paragraph on the da\n[…]\named, so a transport without\npartial messages (and the existing tests) behave unchanged. thinking_delta\nis filtered out — it is not agent prose.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(RUN-77): stream raw text deltas so the transcript keeps the model…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T02:28:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "abfc44a85a0734b34a949e31acbd2d2b78d581ae",
          "body": null,
          "is_bot": false,
          "headline": "noriq run run_mroazpfk3d704r0i4e6j: reviewer fix round 1",
          "author_name": "Noriq Runner",
          "author_login": null,
          "committed_at": "2026-07-17T02:26:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "261e0f279af73d9e28c50ef83446d2bb90aa137f",
          "body": "…` — guided .noriq/project.toml, the last hand-written TOML",
          "is_bot": false,
          "headline": "noriq run run_mroazpfk3d704r0i4e6j: RUN-56 `noriq-runner init-project…",
          "author_name": "Noriq Runner",
          "author_login": null,
          "committed_at": "2026-07-17T02:24:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "66caab422866384f9ed215fadbbd731dd405e4d6",
          "body": "Reviewer/verify gate scoped to the diff, intent treated as a floor not a\nceiling (RUN-76) — stops the fresh reviewer flagging pre-existing code and\nextra behavior, restoring a reachable PASS.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.5.3",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T02:11:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fe9e7126935ba05158273582cc7b77d2691d14b5",
          "body": "…floor\n\nThe inline reviewer (RUN-61) and the dispatched verify agent (RUN-20) were\ndriving good runs to a terminal FAIL. Each round spawns a fresh, stateless\nreviewer that read whole changed files and flagged PRE-EXISTING committed code\nas if this run wrote it, measured against a literal brief a lat\n[…]\nd end-to-end; 524 tests green.\n\nMove 2 (cross-round adjudication ledger) and the maxRounds budget are tracked\nfollow-ups, deliberately not here.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(RUN-76): scope the reviewer/verify gate to the diff, intent as a …",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T02:10:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7da0ad41102b51700e45e511d192f10bb808c873",
          "body": "The conflict prompt spoke git: \"being rebased onto X\", \"git rebase\n--continue\", \"worktree\". But agent conflict-resolution runs on any backend\nwhose conflicts are editable files — the vcs/ seam is built on the integration\nOUTCOME, not git verbs (a server-side-conflict backend sets resolveUrl and\nneve\n[…]\ntrality + parseResolution) and a non-git assertion for the\nverify prompt; documented the agnosticism rule in prompts/README.md. 521 tests\ngreen.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(prompts): make agent prompts VCS/driver-agnostic",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T01:40:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "86967f24119ad367fc9bd67f60aeb68900c8abc9",
          "body": "`npm version` rewrites package.json in npm's canonical style (arrays expanded\none item per line), which fails `biome check` — the publish gate died on the\nformatter for v0.5.1 and v0.5.2 before ever reaching npm. Re-cut of v0.5.2\nrides this commit.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: biome-format package.json after the npm version rewrite",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T01:26:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ab2c2a4d0f2701508453d9d6eb054d278cce0113",
          "body": null,
          "is_bot": false,
          "headline": "cut v0.5.2",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T01:22:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bd8925d3749965b2cc10500239b4efdb8def85ab",
          "body": null,
          "is_bot": false,
          "headline": "Prompt improvements",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T01:22:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1a437ef45aa9ffe88bbd0d714b0e10767fbab02d",
          "body": null,
          "is_bot": false,
          "headline": "v0.5.1",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T00:41:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "455903110f41902a1c5509171c3bb6d6ce1f449e",
          "body": "…blish\n\nA builder's fix turn writes to the working tree, but two downstream gates read\nCOMMITTED state — the inline reviewer via `git diff base...HEAD`, and landing via\npublish's fast-forward. So a fix was invisible to the fresh reviewer (which re-read\nthe same commit and re-reported the same findin\n[…]\nion the rebase gate had just rejected). Fold the worktree into the\nbranch before each handoff; a clean tree is a no-op checkpoint.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: commit working-tree fixes before re-review and before landing pu…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T00:41:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "14e9a80401a507080989c64874d72317d4088402",
          "body": "The words an agent is handed were scattered across six template literals in five\nfiles; tuning a sentence meant finding it in code. Now prompts/ holds one markdown\nfile per voice (identity/scope/build, verify-agent, reviewer, the two feedback\nturns, conflict, resume) and src/prompts.ts renders them \n[…]\nk, so editing a template\nneeds no build step. Rendered output is byte-identical — the existing prompt\nassertions across the suite are the proof.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: consolidate every static prompt into prompts/*.md templates",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T00:30:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2151f549a54e1bccb3f8f251e494ba888d8cc9cc",
          "body": "The run transcript (RUN-74): the daemon streams every voice in a run — builder turns,\neach inline-reviewer round, the verify command's outcome, daemon milestones — as an\nappend-only role-labeled run.log stream, so a refusal is readable from the dashboard.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.5.0",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T00:02:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f5415f95609b96d5c29b7c0120ed79bb32edacda",
          "body": "…hboard, in order\n\nDogfood pain: both builds were refused by the inline reviewer and the dashboard could not\nsay why — only the core agent's rolling logTail ever left this daemon; the reviewer's\nreport, the verify command's output, and the fix rounds were invisible.\n\nRunTranscript (src/transcript.ts\n[…]\nished' close. New run.log frame via ws-client; logTail unchanged as the live\npreview. Old server drops the unknown frame — compatible both ways.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-74): stream the run TRANSCRIPT — every voice reaches the das…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T23:54:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e7357c12b9274b8d1b7f661de0a39ec313f41e04",
          "body": "Codex works again on current CLIs: app-server protocol drift (≥0.144) + silently\ndropped JSON-RPC error responses (RUN-72), a killed/verdict-less reviewer is\nno-judgment rather than a refusal, and the daemon speaks MCP with a real session —\nrestoring anchor-task prompts and the gate comments (RUN-73).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.4.1",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T22:38:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e1a380e18c0ba361f1ef8b8232f895d1a0aff3a3",
          "body": "…calls are now refused\n\nThe server started requiring initialize-first (sessionless calls are not attributable),\nand the daemon's mcpCall was a bare tools/call: get_task 400'd, so anchor prompts\ndegraded to bare ids — and add_comment rode the same path, so every gate comment\n(verify failure, reviewer\n[…]\n drops the session and retries ONCE after a\nfresh handshake. Worker isolates recycle sessions at will, so the retry is load-bearing,\nnot polish.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(RUN-73): the daemon speaks MCP with a real session — sessionless …",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T22:36:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5012b519c354d4b007b9730aff5aee73876a8020",
          "body": "…led-reviewer-reads-as-refusal\n\nFound live: the inline reviewer sat 15 minutes at zero CPU while its run hung in\n'verifying'. Two layers, confirmed by driving a real app-server by hand (0.144.5):\n\nThe transport dropped JSON-RPC error RESPONSES — {id, error} has neither 'result' nor\n'method', so a re\n[…]\nk. The adversarial default holds — the run still cannot pass unjudged.\n\nNot the model name: gpt-5.6-sol is valid and answered a live probe turn.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(RUN-72): codex ≥0.144 protocol drift, dropped RPC errors, and kil…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T22:36:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "365130f473ea51acfc5e35366a6ab6db177771bf",
          "body": "The board lock: .noriq/project.toml gains optional `board` (RUN-71) — lock a repo's\nwork to one board within its project, the way `key` locks it to the project.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.4.0",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T21:19:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f771aa102577e23e0b80741bf79de2d7da7f0b5b",
          "body": "… one board\n\n`key` pins a repo to a project; `board` is the same idea one level down. The marker\ncarries a committed board NAME (ids are server-local; this file travels), discovery passes\nit through verbatim, and registration advertises it per repo — the server resolves it and\nlands the repo's agent\n[…]\nrdId). Old server + new runner: the unknown field is stripped;\nnew server + old runner: defaults null. No behavior change until both sides ship.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-71): project.toml optional `board` — lock the repo's work to…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T21:12:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a747c99ac9b38686c85a6d8e062adaf20f23d176",
          "body": "…indows\n\ndetectVcs probes path.join(root, '.git'); the fakes compared against\n'/root/.git' literally, so on windows-latest the probe (backslashes) never\nmatched, every root fell through to the dv registry, and the two precedence\ntests failed — RUN-42's exact lesson, re-learned inside a test fixture. The\nproduct code was correct; the fakes now compare against the OS's own join.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: vcs-detect test fakes match what path.join actually produces on W…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T20:05:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "564de17a5819c54cf1d051d9c4122ee8c8d72024",
          "body": "…sted publishing\n\nTwo things the v0.3.0 cut surfaced:\n\n1. CI has been red since the init-project tests landed, and only on GitHub:\n   runInitProject called detectTools() directly, so on a box with no\n   claude/codex on PATH the \"Agent driver\" question silently disappears and\n   every positional cann\n[…]\nage.json version, full check, and the packed-binary smoke asserting on\n   output (the 0.2.0 lesson) — all before publish. Provenance rides free.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: fix the wizard suite on runners without CLIs; publish via npm tru…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T20:02:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cc33a52d8d3be660bf9434ac46dfcf66a5488127",
          "body": "The VCS-split release, plus the verify stage growing up:\n- Pluggable source control (RUN-49/50/54/55/51/60/52): nine-outcome VcsBackend,\n  git + Diversion + Perforce (live-accepted), per-repo detection and routing.\n- The verify stage is a choice (RUN-61): cmd floor, inline reviewer agent with\n  its \n[…]\no the driver's auto mode (RUN-68).\n- noriq-runner init-project (RUN-56); npm-bin entry-guard fix + packed-tarball\n  CI smoke (the 0.2.0 lesson).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v0.3.0",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T19:58:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ce27d359fef1b81f0e66632985c00a3090812a6e",
          "body": "…different driver\n\nThe strongest form of the reviewer's independence: not just a fresh session, a\ndifferent VENDOR's model judging the work — codex reviewing claude's diff, or\nthe reverse. Null = the run's own driver, unchanged.\n\nTwo sharp edges, both deliberate:\n- A configured tool with no driver o\n[…]\niq/run-70 (aeb029d, off the freshly-merged main —\nrun-47/61/68 all landed upstream while this was in flight); re-vendored.\n490 tests / 36 files.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-70): [verify.agent].tool — the inline reviewer may run on a …",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T19:54:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "eb7d898e63002929710f7812eb4228eb78b45d9b",
          "body": "…an + the dependency pair\n\nA live scope run promised in its plan body to cut the five artifact RUN-59\nedges its enforced phase ordering minted, then found its floor denies\nremove_dependency — and update_plan too, so it could not even amend the\npromise. It raise_alerted (correctly) and the cost lande\n[…]\nrun had\nto work it out and could only apologize — and tells the agent to record any\nunavailable cleanup in the plan body rather than promise it.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(RUN-69): scope's floor lets it TEND the plan it mints — update_pl…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T18:39:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ae875c018115dae19c19a0e56831d83c03e04984",
          "body": "…ver's auto mode\n\n\"Bare Bash and danger-full-access are never granted\" becomes \"never granted\nUNINVITED\": a repo's committed manifest may now opt a kind into the driver's\nown auto mode — Claude bypass-permissions; codex danger-full-access — instead\nof the curated allowlist. Default false, and the de\n[…]\nmd, and CLAUDE.md's invariant list.\n\nSchema on planar branch noriq/run-68 (1f52132, stacked on noriq/run-61);\nre-vendored. 486 tests / 36 files.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-68): [permissions.<kind>].auto — committed opt-in to the dri…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T18:32:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ca55b0d87215b3fd006120969a6246755a509452",
          "body": "…d for now\n\nThe repo carries its own .noriq/project.toml (key RUN, npm run check floor +\nthe RUN-61 inline reviewer) so the runner can supervise work on itself. A\nmarker is normally COMMITTED — ignored here deliberately while the loop gets\nshaken out; drop the ignore line to share it.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: ignore .noriq/ — the runner dogfoods itself, marker uncommitte…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T18:12:26Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9546ab97d0b20ca68b10866e5ba2ff9da5d26fb0",
          "body": "…eviewer agent, both, or none\n\nA static command was the only inline gate, and for complex projects \"the tests\npass\" is a much weaker claim than \"this diff satisfies the intent\". [verify] now\nexpresses a per-repo choice by what it contains: omit it = no verify stage (the\nhuman is the gate); cmd = the\n[…]\nmodel.ts picks up\nPLNR-126's dueAt drift). init-project asks the choice; every .cmd call site\nnarrows through cmdVerify(). 483 tests / 36 files.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-61): the verify stage becomes a choice — cmd floor, inline r…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T18:08:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cef3e311b94c453a0c23356a94a676e14e9b3a4b",
          "body": "… verify get_briefing join it\n\nThe daemon now sends noriqToolNamesFor(kind) with createRunAgent, and the server\nadvertises (and registers) exactly that list for the run agent's credential — the\ncatalogue the model sees and the allowlist the drivers enforce become two views of\none policy, ending adve\n[…]\nwedTools, buildMcpServer floor filter). Older servers ignore the\nfield; older daemons omit it and their agents see the full catalogue as before.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-47): declare the Noriq tool floor to the server; heartbeat +…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T17:30:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "eba928615f0ab048cafa7f137c9ec5bab6cd1ddf",
          "body": "…ude-only\n\nnoriqToolsFor lived in drivers/claude.ts and nothing else read it, so the\nper-kind Noriq floor — scope proposes but cannot claim; build claims but\ncannot mint plans; verify reads and comments but never mutates — was quietly\na property of ONE DRIVER. The same verify run on codex had every \n[…]\n and the tests pin the exact -c argument per kind,\nmirroring the claude floor tool-for-tool from the single policy.\n\n454/35 green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(RUN-46): the per-kind Noriq tool floor reaches codex — it was Cla…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T16:47:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1b45af7f34026ca8b107260df8a5fe96ddefdd4c",
          "body": "… live p4d\n\nBuilt on RUN-55's measurements and then PROVEN live: the real backend drove\na real p4d through the full cycle — lease → agent write → checkpoint(shelve)\n→ integrate → publish(submit), landed; then the race (the server's own\nout-of-date refusal → {race}); then a real conflict: paths repor\n[…]\nouted per repo like Diversion, one instance per repo or the lease\ndies. THREAT-MODEL.md carries the Perforce table.\n\n451/35 green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-52): PerforceBackend — the third backend, accepted against a…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T16:38:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "11f19c8ffc4810139f5bae5ee7720f8202d8e372",
          "body": "DiversionBackend was a proven passenger with no vehicle — the daemon\nhardcoded GitBackend for every repo. Now each discovered repo is detected\nand routed, and DETECTION is the mechanism, never a manifest field: a\ncommitted `vcs = \"git\"` in the wrong checkout is a lie the daemon would\ntrust, and the \n[…]\n workspaces → diversion with correct repo\nids through the /home symlink, unknown roots → git fallback with a reason.\n431/34 green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-60): the daemon routes each repo to its VcsBackend by detection",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T16:14:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0c6161cc4804114f862b62b77e9b111b045b2520",
          "body": "…backend\n\nThe second VcsBackend, and the seam-finder the plan wanted: no rebase, no\nfast-forward, no honest server-side CAS, conflicts that are not files — and\nthe nine outcomes hold anyway. Grounded end to end: RUN-54 measured the\nserver's behaviour (VCS-SPIKE.md §9), the API mapping was read from\n\n[…]\n NOT yet wired into the daemon — backend selection per repo\nis filed separately; GitBackend remains the only routed backend today.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-51): DiversionBackend — the interface survives a live-model …",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T16:03:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "474c981a083b61e7aa968393468899c00ff13df3",
          "body": "…location\n\nThe trap, demonstrated by real server data during RUN-55: one Perforce -Mj\nresolve object carries clientFile (a filesystem path) and //depot/shared.txt\nside by side — and a depot path satisfies BOTH startsWith('/') (RUN-42's bug)\nand path.isAbsolute() (RUN-42's fix) while being no path at\n[…]\nmpt still assembles\n`git diff` text — prompt assembly becomes backend-aware when a second backend\nexists to need it. 402/32 green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(RUN-50): Workspace splits the local path from the backend's …",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T15:17:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3d326f04c1f6b46a69326fe01e52fdcc7f635f3a",
          "body": "Stood up a real p4d (2024.2, license-free at this scale) in a scratch dir:\ntwo curls and one command. The plan's \"long pole\" was a fear, not a fact.\nVCS-SPIKE.md §10 is the addendum.\n\nThe headline: Diversion and Perforce swap places. Everything the paper spike\nfeared about Perforce is native and scr\n[…]\ncorded: keep RUN-52 after RUN-51, drop the mechanical half\nof the \"or never\" hedge — what remains of it is demand, not difficulty.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(RUN-55): Perforce hands-on — the difficulty ordering inverts",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T14:58:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "12ead4ead293aa4a9c61270d2acfd4529ca82f33",
          "body": "…t a real server\n\nThe dv CLI was already on this box (v1.0.624, authenticated), so RUN-54's\ninfrastructure cost was zero and the discovery ran today, in a throwaway repo\ndeleted afterwards. VCS-SPIKE.md §9 is the addendum; §4 and §8 now point at it\nwhere it corrects them.\n\nThe headline: there is no \n[…]\nmand, no forge credential\n- everything is authored as the account — no per-invocation identity, no\n  second credential to withhold\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(RUN-54): Diversion hands-on — the paper spike's §4 tested agains…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T14:50:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a7dfc4c5784210ce09ab9dfa7b1cc24238ff27ff",
          "body": "…'s DI seam\n\nThe seam already existed — RunSupervisor's Pick<WorktreeManager> declared\nexactly what it needs from source control — so this renames it rather than\ndesigns it: src/vcs/types.ts names the nine outcomes (VcsBackend), and\nsrc/vcs/git.ts is git's implementation, a thin delegation over Work\n[…]\nsertion changed. Workspace stays an alias of WorktreeInfo: RUN-50 owns\nthe localPath/location split and nothing here pre-empts it.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(RUN-49): extract the nine VCS outcomes behind the supervisor…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T14:39:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a672b25e28744381145dfdaae6e294a438f155b8",
          "body": "RUN-40 removed the hand-written-TOML cliff for runner.toml and left the other\nhalf standing: `init` set up the machine, then told you to copy 130 lines of\nproject.toml.example and edit it by hand. Same cliff, one step later.\n\nFollows RUN-40's three rules, which earned their place — validate before\nw\n[…]\nn).\n\nAlso fixes two more stale \"the daemon never pushes\" claims in\nproject.toml.example, and documents init-project in the README.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-56): `noriq-runner init-project` — the last hand-written TOML",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-15T18:57:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "10aeb9dff0ade9e62dce9de3ed2512910e3b7d63",
          "body": "`npm version patch` rewrites package.json with its own formatter, which expands\nthe keywords/files arrays and disagrees with biome. Separated from the fix so\nthe fix commit stays about the fix.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "style: reformat package.json after the version bump",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-15T18:35:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2615711682febc751145292cce01caac41ac8cda",
          "body": "v0.2.0 is unusable. `npm i -g @noriq-dev/runner && noriq-runner version`\nprints nothing and exits 0 — for every command, on every platform.\n\nThe entry guard compared `import.meta.url` to a raw `process.argv[1]`. Node\nresolves symlinks when it resolves a module, so import.meta.url is the real\npath; a\n[…]\nasserting on OUTPUT rather than exit code: the\nbug was exit 0.\n\nBumped to 0.2.1 — 0.2.0 cannot be fixed in place and does nothing.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: the published binary never ran — entry guard vs npm's bin symlink",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-15T18:35:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        }
      ],
      "releases_count": 18,
      "commits_last_year": 128,
      "latest_release_at": "2026-07-20T20:43:46Z",
      "latest_release_tag": "v0.13.2",
      "releases_from_tags": true,
      "days_since_last_push": 6,
      "active_weeks_last_year": 2,
      "days_since_latest_release": 6,
      "mean_days_between_releases": 0.4
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": false,
      "has_contributing": false,
      "health_percentage": 25,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "@noriq-dev/runner",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "noriq",
            "agents",
            "claude",
            "codex",
            "coding-agent",
            "daemon",
            "cli"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@noriq-dev/runner",
          "is_deprecated": false,
          "latest_version": "0.13.2",
          "repository_url": "https://github.com/noriq-dev/runner",
          "versions_count": 20,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 3136,
          "first_published_at": "2026-07-15T14:44:19.071000Z",
          "latest_published_at": "2026-07-20T20:44:32.746000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 6
        }
      ]
    },
    "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": 142651,
      "source_files_sampled": 102,
      "oversized_source_files": 2,
      "agent_instruction_files": [
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 9890
    },
    "dependencies": {
      "manifests": [
        "package.json"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 12,
        "malicious_count": 0,
        "assessed_package": "npm:@noriq-dev/runner@0.13.2",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "@anthropic-ai/claude-agent-sdk",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.3.0"
        },
        {
          "name": "smol-toml",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.3.1"
        },
        {
          "name": "ws",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^8.21.1"
        },
        {
          "name": "zod",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.0.0"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 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": "mtuska",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/1342434?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "publish.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [
        "biome.json"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 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": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 2,
            "reason": "dependency not pinned by hash detected -- score normalized to 2",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "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": 8,
            "reason": "2 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "6a9d9ada6fd2846aefc5cb5d1dfe42e0ed8e2adb",
        "ran_at": "2026-07-27T13:10:33Z",
        "aggregate_score": 3.4,
        "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-20T20:44:36Z",
      "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/noriq-dev/runner",
    "host": "github.com",
    "name": "runner",
    "owner": "noriq-dev"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "at_risk",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 48,
      "inputs": {
        "security": 47,
        "vitality": 68,
        "community": 32,
        "governance": 32,
        "engineering": 60
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "moderate",
        "name": "Vitality",
        "value": 68,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "commits_last_year": 128,
              "human_commit_share": 1,
              "days_since_last_push": 6,
              "active_weeks_last_year": 2
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 6 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "2/52 weeks with commits",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 2
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "128 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 128
                    }
                  }
                ],
                "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.2",
              "releases_from_tags": true,
              "days_since_latest_release": 6,
              "mean_days_between_releases": 0.4
            },
            "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 6 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~0.4 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 0.4
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 32,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 0,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "0 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 58,
            "inputs": {
              "packages": [
                "@noriq-dev/runner"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 3136
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "3,136 downloads/month across npm",
                "points": 46.6,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 3136,
                      "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": 32,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 10,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "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": "at_risk",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 34,
            "inputs": {
              "followers": 0,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "noriq-dev",
              "public_repos": 3,
              "account_age_days": 12
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "0 followers of noriq-dev",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 0,
                      "login": "noriq-dev"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "3 public repos, account ~0 yr old",
                "points": 4.4,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 3
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 0
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "@noriq-dev/runner"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 6
            },
            "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 6 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "20 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 20
                    }
                  }
                ],
                "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": 60,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "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": 80,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": "biome.json",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "biome.json"
                    }
                  }
                ],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "at_risk",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 30,
            "inputs": {
              "topics": [],
              "has_wiki": false,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "has_description": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 47,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 34,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 3.4
            },
            "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 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 2",
                "points": 1,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "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": "2 existing vulnerabilities detected",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the npm:@noriq-dev/runner@0.13.2 runtime dependency closure — what installing the published package pulls in — 12 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "npm:@noriq-dev/runner@0.13.2",
                  "assessed": 12
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 12,
              "unassessed_packages": 0,
              "affected_by_severity": "none",
              "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": "no indirect dependency carries a known advisory",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "no_indirect_advisories",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "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": 12,
              "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": 1
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 79,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.76,
              "agent_instruction_files": [
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 9890
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "76 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 76,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 66,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "tsconfig.json"
              ],
              "agent_commit_share": 0.81,
              "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": "biome.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "biome.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "81 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 81,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 2",
                "points": 2,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 99,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 142651,
              "source_files_sampled": 102,
              "oversized_source_files": 2
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "TypeScript (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "TypeScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "2/102 source files over 60KB",
                "points": 53.9,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 102,
                      "oversized": 2
                    }
                  }
                ],
                "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:10:39.536239Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/n/noriq-dev/runner.svg",
  "full_name": "noriq-dev/runner",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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