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

csuzngjh / principles

Owner-governed behavior alignment and co-evolution system for AI agents. Distills agent behavioral evidence into reviewed, reversible principles.

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

csuzngjh/principles має індекс здоров’я 70 зі 100, що відповідає смузі «Добрий». Найвищий показник — Vitality (87/100), найнижчий — Community & Adoption (47/100). Останнє оновлення — сьогодні. Більшість нещодавньої роботи виконує один учасник.

70
загалом / 100
Добрий

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

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

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

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

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

Власність

PDОсобистий обліковий запис
9 підписників2 публічні репозиторіїз груд. 2014 р.

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

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

РеєстрПакетВерсіяЗавантажень / місВерсіїОстання публікаціяТеги
npm@principles/pd-cli1.133.03 6287024 дні тому
npmprinciples-disciple1.197.1317 6972324 дні тому
npm@principles/core1.240.1019 8531974 дні тому
npmcreate-principles-disciple1.104.03 5223418 днів томуopenclawprinciples-disciplecliinstallerinteractive

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

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

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

87Відмінний · 22% загального індексу
Як обчислюється оцінка
36/36Свіжість push — останній push 0 дн. тому
13.8/36Ритм комітів — 20/52 тижнів із комітами
18/18Обсяг комітів — 1 712 комітів за останній рік
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 9 issue activity found in the last 90 days -- score normalized to 10
Використані вхідні дані
commits_last_year1 712
human_commit_share0,81
days_since_last_push0
active_weeks_last_year20
Як обчислюється оцінка
27/27Випускає релізи — опубліковано 4 релізів
36/36Свіжість релізів — останній реліз 18 дн. тому
27/27Ритм релізів — реліз кожні ~11,1 дн.
0/10OpenSSF Scorecard: Signed-Releases — немає даних
Використані вхідні дані
releases_count4
latest_release_tagv1.75.1
releases_from_tagsні
days_since_latest_release18
mean_days_between_releases11,1
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: Signed-Releases. Залишкові ваги перенормовано.

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

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

47У зоні ризику · 18% загального індексу
Як обчислюється оцінка
0/60Зірки — 1 зірок
0/25Форки — 1 форків
0/15Спостерігачі — 0 спостерігачів
Використані вхідні дані
forks1
stars1
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonbelow_threshold
Як обчислюється оцінка
22.5/22.5README
22.5/22.5Ліцензія — визнана ліцензія (MIT)
18/18Настанови CONTRIBUTING
0/13.5Кодекс поведінки
0/7.2Шаблон issue
6.3/6.3Шаблон PR
Використані вхідні дані
has_readmeтак
has_licenseтак
has_contributingтак
has_issue_templateні
has_code_of_conductні
has_pull_request_templateтак
Як обчислюється оцінка
62/80Щомісячні завантаження — 44 700 завантажень/місяць у npm
0/20Залежні пакети в реєстрі — ця екосистема цього не повідомляє
Використані вхідні дані
packages@principles/pd-cli, principles-disciple, @principles/core, create-principles-disciple
dependents
ecosystemsnpm
total_downloads
monthly_downloads44 700
Виключено з оцінювання (немає даних або не застосовно): Залежні пакети в реєстрі. Залишкові ваги перенормовано.

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

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

56Помірний · 24% загального індексу
Як обчислюється оцінка
9/54Бас-фактор — на 1 контриб’ютор(ів) припадає половина всіх комітів
0/22.5Розподіл комітів — головний контриб’ютор — автор 100% комітів
4.1/13.5Широта контриб’юторів — 3 контриб’юторів
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Використані вхідні дані
bus_factor1
contributors_sampled3
top_contributor_share0,998
Як обчислюється оцінка
46.8/46.8Вирішення issue — закрито 100% issue
34.9/38.3Прийняття PR — злито 1 007/1 105 вирішених PR
6/15OpenSSF Scorecard: Code-Review — Found 9/19 approved changesets -- score normalized to 4
Використані вхідні дані
merged_prs1 007
open_issues0
closed_issues132
issue_closed_ratio1
closed_unmerged_prs98

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

41У зоні ризику
Як обчислюється оцінка
10/30Підтримка власника — особистий (користувацький) обліковий запис
0/20Верифікований домен — не застосовно до користувацьких облікових записів
7.2/25Охоплення власника — 9 підписників у csuzngjh
15.5/25Послужний список — 2 публічних репозиторіїв, вік облікового запису ~11 р.
Використані вхідні дані
followers9
owner_typeUser
is_verified
owner_logincsuzngjh
public_repos2
account_age_days4 248
Виключено з оцінювання (немає даних або не застосовно): Верифікований домен. Залишкові ваги перенормовано.

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

100Відмінний
Як обчислюється оцінка
25/25Опубліковано й доступно — 4 пакет(ів) у npm
35/35Свіжість публікацій — остання публікація 4 дн. тому
20/20Історія версій — 232 опублікованих версій
20/20Не застарілий — активний, не deprecated і не yanked
Використані вхідні дані
packages@principles/pd-cli, principles-disciple, @principles/core, create-principles-disciple
ecosystemsnpm
any_deprecatedні
min_days_since_publish4

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

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

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

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

90Відмінний
Як обчислюється оцінка
30/30README
25/25Каталог документації
15/15Сайт документації / домашня сторінка — https://principles-website.pages.dev
10/10Опис репозиторію
10/10Теми — 12 тем
0/10Wiki
Використані вхідні дані
topicsai-agent, monorepo, openclaw, openclaw-plugin, principles, self-improving, sqlite, typescript, pain-signals, agent-governance, co-evolution, alignment-layer
has_wikiні
homepagehttps://principles-website.pages.dev
has_readmeтак
has_docs_dirтак
has_descriptionтак

Безпека

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

72Добрий · 16% загального індексу

Стан безпеки

65Помірний
Як обчислюється оцінка
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — немає даних
2.5/2.5CI-Tests — 28 out of 28 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
3/7.5Code-Review — Found 9/19 approved changesets -- score normalized to 4
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Ліцензія — license file detected
7.5/7.5Maintained — 30 commit(s) and 9 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
3/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 6
5/5SAST — SAST tool is run on all commits
5/5Security-Policy — security policy file detected
0/7.5Signed-Releases — немає даних
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 50 existing vulnerabilities detected
Використані вхідні дані
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate6,5
Виключено з оцінювання (немає даних або не застосовно): branch_protection, signed_releases. Залишкові ваги перенормовано.
Як обчислюється оцінка
35/35Прямі залежності без відомих сповіщень — жодна пряма залежність не має відомих сповіщень
25/25Непрямі залежності без відомих сповіщень — жодна непряма залежність не має відомих сповіщень
0/40Немає задавнених сповіщень — жодне сповіщення не має дати публікації
Використані вхідні дані
sourceosv
advisories0
affected_packages0
assessed_packages161
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Виключено з оцінювання (немає даних або не застосовно): Немає задавнених сповіщень. Залишкові ваги перенормовано. Звірено з runtime-замиканням залежностей npm:@principles/pd-cli@1.133.0 — тим, що тягне за собою встановлення опублікованого пакета, — 161 пакетів. Досяжність не аналізується.

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

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

80Добрий · 0% загального індексу
Як обчислюється оцінка
45/45Інструкції для агентів — AGENTS.md, CLAUDE.md, GEMINI.md, packages/create-principles-disciple/templates/langs/en/core/AGENTS.md, packages/create-principles-disciple/templates/langs/zh/core/AGENTS.md, packages/openclaw-plugin/src/core/AGENTS.md, packages/openclaw-plugin/src/hooks/AGENTS.md, packages/openclaw-plugin/templates/langs/en/core/AGENTS.md, packages/openclaw-plugin/templates/langs/zh/core/AGENTS.md, packages/website/video/homepage-demo/AGENTS.md, packages/website/video/homepage-demo/CLAUDE.md
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 81 з 81 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share1
agent_instruction_filesAGENTS.md, CLAUDE.md, GEMINI.md, packages/create-principles-disciple/templates/langs/en/core/AGENTS.md, packages/create-principles-disciple/templates/langs/zh/core/AGENTS.md, packages/openclaw-plugin/src/core/AGENTS.md, packages/openclaw-plugin/src/hooks/AGENTS.md, packages/openclaw-plugin/templates/langs/en/core/AGENTS.md, packages/openclaw-plugin/templates/langs/zh/core/AGENTS.md, packages/website/video/homepage-demo/AGENTS.md, packages/website/video/homepage-demo/CLAUDE.md
agent_instruction_max_bytes22 917
Як обчислюється оцінка
0/18Розгортання однією командою
22/22Автоматизовані тести
11/11Конфігурація лінтера / форматера — eslint.config.js
11/11Статична перевірка типів — packages/create-principles-disciple/tsconfig.json, packages/openclaw-plugin/tsconfig.json, packages/pd-cli/tsconfig.json, packages/pd-console/tests/e2e/tsconfig.json, packages/pd-console/tsconfig.json, packages/principles-core/tsconfig.json, scripts/nocturnal/tsconfig.json, tests/e2e-fixtures/trap-01-circular-dep/tsconfig.json, tsconfig.json
10/10Відтворюване середовище — lockfile
2/10Підтверджена практика роботи з агентами — 1 з останніх 100 комітів створено агентом або з його зазначенням
8/8Автоматизоване супроводження — 19 з останніх 100 комітів — автоматичні оновлення залежностей
6/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 6
Використані вхідні дані
has_nixні
has_testsтак
lockfilespackage-lock.json
has_dockerfileні
typed_languageтак
bootstrap_files
has_devcontainerні
has_linter_configтак
typecheck_configspackages/create-principles-disciple/tsconfig.json, packages/openclaw-plugin/tsconfig.json, packages/pd-cli/tsconfig.json, packages/pd-console/tests/e2e/tsconfig.json, packages/pd-console/tsconfig.json, packages/principles-core/tsconfig.json, scripts/nocturnal/tsconfig.json, tests/e2e-fixtures/trap-01-circular-dep/tsconfig.json, tsconfig.json
agent_commit_share0,01
toolchain_manifests
dependency_bot_commit_share0,19
Як обчислюється оцінка
45/45Типізований код — TypeScript (статично типізована)
54.4/55Керовані розміри файлів — 16/1 463 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languageTypeScript
largest_source_bytes200 404
source_files_sampled1 463
oversized_source_files16

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

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

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

  • Could not fetch npm package '@principles/nocturnal-benchmark' from its registry
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Докладніше

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

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

0001111112026-052026-062026-06
Мажорні 0Мінорні 2Патчі 1
OpenSSF Scorecard 6.5 / 10
6.5сукупно

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

10Binary-Artifactsno binaries found in the repo
н/дBranch-Protectioninternal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
10CI-Tests28 out of 28 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
4Code-ReviewFound 9/19 approved changesets -- score normalized to 4
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 9 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
6Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 6
10SASTSAST tool is run on all commits
10Security-Policysecurity policy file detected
н/дSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities50 existing vulnerabilities detected
Прямі залежності 53
РеєстрПакетОбмеження версіїМаніфест
npmglob^13.0.6package.json
npm@inquirer/prompts^8.4.3packages/create-principles-disciple/package.json
npmcommander^14.0.3packages/create-principles-disciple/package.json
npmfs-extra^11.3.6packages/create-principles-disciple/package.json
npmjs-yaml^5.2.0packages/create-principles-disciple/package.json
npmora^9.4.0packages/create-principles-disciple/package.json
npmpicocolors^1.0.0packages/create-principles-disciple/package.json
npmsemver^7.8.5packages/create-principles-disciple/package.json
npmtar^7.5.15packages/create-principles-disciple/package.json
npm@principles/core^1.74.1packages/openclaw-plugin/package.json
npm@sinclair/typebox^0.34.48packages/openclaw-plugin/package.json
npmbetter-sqlite3^12.9.0packages/openclaw-plugin/package.json
npmcommander^12.0.0packages/openclaw-plugin/package.json
npmjs-yaml^5.2.0packages/openclaw-plugin/package.json
npmmicromatch^4.0.8packages/openclaw-plugin/package.json
npm@principles/core^1.74.1packages/pd-cli/package.json
npmprinciples-disciple^1.74.1packages/pd-cli/package.json
npmbetter-sqlite3^12.9.0packages/pd-cli/package.json
npmcommander^12.0.0packages/pd-cli/package.json
npmjs-yaml^4.1.1packages/pd-cli/package.json
npm@fontsource/jetbrains-mono^5.2.8packages/pd-console/package.json
npm@principles/core*packages/pd-console/package.json
npm@radix-ui/react-alert-dialog^1.1.15packages/pd-console/package.json
npm@radix-ui/react-dialog^1.1.15packages/pd-console/package.json
npm@radix-ui/react-select^2.2.6packages/pd-console/package.json
npm@radix-ui/react-slot^1.2.4packages/pd-console/package.json
npm@radix-ui/react-tooltip^1.2.11packages/pd-console/package.json
npm@tailwindcss/postcss^4.3.0packages/pd-console/package.json
npm@tailwindcss/vite^4.3.0packages/pd-console/package.json
npmautoprefixer^10.5.2packages/pd-console/package.json
npmbetter-sqlite3^12.9.0packages/pd-console/package.json
npmclass-variance-authority^0.7.1packages/pd-console/package.json
npmclsx^2.1.1packages/pd-console/package.json
npmi18next^26.1.0packages/pd-console/package.json
npmjs-yaml^4.2.0packages/pd-console/package.json
npmlucide-react^1.23.0packages/pd-console/package.json
npmpostcss^8.5.14packages/pd-console/package.json
npmpostcss-cli^11.0.1packages/pd-console/package.json
npmreact^19.2.7packages/pd-console/package.json
npmreact-dom^19.2.7packages/pd-console/package.json
npmreact-i18next^17.0.8packages/pd-console/package.json
npmreact-router-dom^7.15.0packages/pd-console/package.json
npmsemver^7.8.5packages/pd-console/package.json
npmsonner^2.0.7packages/pd-console/package.json
npmtailwind-merge^3.6.0packages/pd-console/package.json
npmtailwindcss^4.3.2packages/pd-console/package.json
npm@earendil-works/pi-agent-core^0.79.4packages/principles-core/package.json
npm@earendil-works/pi-ai^0.80.7packages/principles-core/package.json
npm@mariozechner/pi-ai^0.73.1packages/principles-core/package.json
npm@sinclair/typebox^0.34.48packages/principles-core/package.json
npmbetter-sqlite3^12.9.0packages/principles-core/package.json
npmjs-yaml^4.1.1packages/principles-core/package.json
npmtypebox^1.2.2packages/principles-core/package.json
Усі залежності не зібрано

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

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

Встановлення npm:@principles/pd-cli@1.133.0 тягне 161 пакетів, прямих і транзитивних: 0 мають відомі сповіщення, з них 0 — прямі залежності.

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

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

Звіт у форматі JSON машиночитний
{
  "data": {
    "repo": {
      "topics": [
        "ai-agent",
        "monorepo",
        "openclaw",
        "openclaw-plugin",
        "principles",
        "self-improving",
        "sqlite",
        "typescript",
        "pain-signals",
        "agent-governance",
        "co-evolution",
        "alignment-layer"
      ],
      "is_fork": false,
      "size_kb": 74437,
      "has_wiki": false,
      "homepage": "https://principles-website.pages.dev",
      "languages": {
        "CSS": 17023,
        "Vue": 59266,
        "HTML": 58196,
        "Shell": 166854,
        "Python": 202606,
        "JavaScript": 517646,
        "PowerShell": 8344,
        "TypeScript": 14877517
      },
      "pushed_at": "2026-07-22T01:58:27Z",
      "created_at": "2026-01-22T15:31:22Z",
      "owner_type": "User",
      "updated_at": "2026-07-17T07:46:13Z",
      "description": "Owner-governed behavior alignment and co-evolution system for AI agents. Distills agent behavioral evidence into reviewed, reversible principles.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript"
      ]
    },
    "owner": {
      "blog": null,
      "name": "PD",
      "type": "User",
      "login": "csuzngjh",
      "company": null,
      "location": null,
      "followers": 9,
      "avatar_url": "https://avatars.githubusercontent.com/u/10056748?v=4",
      "created_at": "2014-12-03T05:40:46Z",
      "is_verified": null,
      "public_repos": 2,
      "account_age_days": 4248
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v1.75.1",
          "kind": "patch",
          "published_at": "2026-07-03T10:08:10Z"
        },
        {
          "tag": "v1.74.1",
          "kind": "patch",
          "published_at": "2026-06-21T16:10:19Z"
        },
        {
          "tag": "v1.74.0",
          "kind": "minor",
          "published_at": "2026-06-06T06:31:05Z"
        },
        {
          "tag": "v1.73.0",
          "kind": "minor",
          "published_at": "2026-05-31T03:28:38Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "f7acb0f4a9c98ad4bb5614b13cf02479b4d3639a",
          "body": "…nalization-auto-consumer-service (#1235)\n\n* test: add coverage for pd-task-reconciler, evolution-dedup, and internalization-auto-consumer-service\n\nAdded comprehensive unit tests for three previously untested modules:\n\n1. pd-task-reconciler.test.ts (8 tests)\n   - Orphan job detection and logging\n   \n[…]\nruncation is removed.\n\n5. internalization-auto-consumer-service: replaced 'as any' casts with\n   OpenClawPluginServiceContext (project No-any rule) and renamed the\n   duplicated nested describe block.",
          "is_bot": false,
          "headline": "test: add coverage for pd-task-reconciler, evolution-dedup, and inter…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-17T07:46:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "89c9185459e186a44e54d4e30af318c0e9e48324",
          "body": "…m #1234) (#1237)\n\n* fix(adapter): use openclaw message files\n\n* fix(adapter): use --message-file in healthCheck probe path\n\nThe previous commit renamed MessageFileRef from {arg, dir} to {filePath}\nand migrated startRun to --message-file, but missed the healthCheck\nprobe-3 path which still reference\n[…]\nAlso add an args assertion to the probe-3 health test so future\nMessageFileRef field renames are caught by tests, not just tsc.\n\n---------\n\nCo-authored-by: AI Assistant <ai-assistant@principles.local>",
          "is_bot": false,
          "headline": "fix(adapter): use --message-file in healthCheck probe path (split fro…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-17T07:43:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "22550fd5ac9fa38fbd3782b13dfeee1c44e460e4",
          "body": "* fix(runtime): bind trajectory context reader\n\n* test(plugin): cover trajectory reader wiring\n\n---------\n\nCo-authored-by: AI Assistant <ai-assistant@principles.local>",
          "is_bot": false,
          "headline": "fix(runtime): bind trajectory context reader (split from #1234) (#1236)",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-17T07:34:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d43d968cd113d95b3388c00471c1df020786e3ce",
          "body": "… (#1213)\n\nProblem: prompt.ts had inconsistent trigger gating — `isUserInteraction`\n(defined inline as user/api/undefined) was used for behavioral-constraint\ninjection, but two other gates still used `trigger === 'user'`, and\nSignalCollectorHost.detectSync had its own `if (trigger !== 'user') return\n[…]\neatures/ asserts on the\ntrigger value; the .feature for story-a asserts the observable\npain → candidate → activation flow, which is unchanged (this fix makes\nMORE corrections flow through, not fewer).",
          "is_bot": false,
          "headline": "fix(prompt): align correction detection gating with isUserInteraction…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-16T15:29:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0762ea26268a80fa66bbe1e9f1346da60f2b4657",
          "body": "…1216)\n\nProblem: scripts/e2e-story-a.mjs had the Story A verdict computation inlined inside generateEvidence(), making it impossible to unit-test. Story A is the P0 MVP validation path — its verdict logic must be testable across all branches.\n\nChanges:\n\n- New scripts/e2e-story-a-verdict.mjs: pure fu\n[…]\n no .feature file under docs/specs/features/ corresponds to the e2e harness; the harness itself is the executable validation for Story A'.\n\nCo-authored-by: AI Assistant <ai-assistant@principles.local>",
          "is_bot": false,
          "headline": "refactor(e2e): extract Story A verdict computation for testability (#…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-16T15:05:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ea0ee1fa9ea1973234b446b2fefde310f1e8db87",
          "body": "… code (#1215)\n\nThree independent robustness fixes for plugin/build scripts:\n\n1. bootstrap-rules.mjs: Empty workspace throws 'No deterministic principles found in training store' which the script treated as a fatal error and exit(1). Now: source (bootstrap-rules.ts) sets err.code = 'NO_DETERMINISTIC\n[…]\nbootstrap-rules.mjs uses 'code' in err (own property check via 'in'); acceptable for plain Error objects where code is set via assignment.\n\nCo-authored-by: AI Assistant <ai-assistant@principles.local>",
          "is_bot": false,
          "headline": "fix(scripts): graceful empty-workspace bootstrap + truthful sync exit…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-16T14:49:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "978ccab0934268cb9a734018b67066a393bed25d",
          "body": "… (#1214)\n\nProblems:\n\n1. pd_shim_info canary check returned a hard-coded version string '0.1.0' that drifted from the actual pd-cli package version (currently 1.74.1), misleading operators about the installed version.\n\n2. runtime_health canary check could report 'healthy' overall status even when to\n[…]\n-action - degraded runtime_health now includes 'pain record' next action. cli-7-test-wiring - new test exercises real readCliVersion path.\n\nCo-authored-by: AI Assistant <ai-assistant@principles.local>",
          "is_bot": false,
          "headline": "fix(canary): report real package version and flag unexercised runtime…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-16T14:41:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5fdf956171f8a20410aa59aa6983f3b93113e1f6",
          "body": "…st errors) (#1217)\n\nPR #1211 added two test files that accessed array indices directly\n(result[0].id) without optional chaining, producing 38 TS2532/TS18048\nerrors under noUncheckedIndexedAccess. Same root cause as PR #1170.\nAlso notes the better-sqlite3 .get() returns {} sibling (TS2339) and\nthe m\n[…]\nty test branch (EP-09).\n\nCompressed earlier ERR-001 recurrences to reduce the field from 4.2KB\nto 2.1KB per check:error-handbook guidance.\n\nCo-authored-by: AI Assistant <ai-assistant@principles.local>",
          "is_bot": false,
          "headline": "docs: record ERR-001 recurrence (PR #1211 noUncheckedIndexedAccess te…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-16T14:23:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e363e9493ca88ea52c501c1d4f7ff792578552b5",
          "body": "…re (#1233)\n\nCo-authored-by: AI Assistant <ai-assistant@principles.local>",
          "is_bot": false,
          "headline": "test: add coverage for subagent-workflow modules and fix workflow-sto…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-16T10:33:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "88152ced270752f89b9cbad4468500bd318f51ac",
          "body": "…ion (#1232)\n\nRecord EP-09 Test Reality Gap finding from PR #1218 self-review:\nquality-scorecard.test.ts line 797 used\n`expect(row.created_at >= before || row.created_at <= after).toBe(true)`\nto verify created_at falls in [before, after] window. The `||` makes\nthis a tautology true for ANY value whe\n[…]\nin ERROR_PATTERN_INDEX.md\n- Extend EP-09 Automation target with ||-joined range bounds scan\n- check:error-handbook passes: 94 entries consistent\n\nCo-authored-by: PD <csuzngjh@users.noreply.github.com>",
          "is_bot": false,
          "headline": "docs(error-handbook): record ERR-094 tautological range-bounds assert…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-16T01:43:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4ac1ae7228b84cf7c07dc9413892c8d52833f0fd",
          "body": "…nclaw-plugin (#1223)\n\n* chore(deps-dev): bump typescript in /packages/openclaw-plugin\n\nBumps [typescript](https://github.com/microsoft/TypeScript) from 6.0.3 to 7.0.2.\n- [Release notes](https://github.com/microsoft/TypeScript/releases)\n- [Commits](https://github.com/microsoft/TypeScript/commits)\n\n-\n[…]\nsupport@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>\nCo-authored-by: PD <csuzngjh@users.noreply.github.com>\nCo-authored-by: PD <csuzngjh@hotmail.com>",
          "is_bot": true,
          "headline": "chore(deps-dev): bump typescript from 6.0.3 to 7.0.2 in /packages/ope…",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-16T01:35:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8f3b0bbb586dba0f03fb8cc09b06217d42b67ca1",
          "body": "…ate-principles-disciple (#1222)\n\n* chore(deps-dev): bump typescript in /packages/create-principles-disciple\n\nBumps [typescript](https://github.com/microsoft/TypeScript) from 6.0.3 to 7.0.2.\n- [Release notes](https://github.com/microsoft/TypeScript/releases)\n- [Commits](https://github.com/microsoft/\n[…]\nsupport@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>\nCo-authored-by: PD <csuzngjh@users.noreply.github.com>\nCo-authored-by: PD <csuzngjh@hotmail.com>",
          "is_bot": true,
          "headline": "chore(deps-dev): bump typescript from 6.0.3 to 7.0.2 in /packages/cre…",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-16T01:28:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "43dec3d540b84a947effdf2590ea9e1834a6b0b0",
          "body": "* test: add coverage for untested core modules and adapters\n\nAdd regression tests for critical modules that previously had zero test\ncoverage, addressing the highest-risk gaps in the principles-core package:\n\n- Adapters: OpenClawPainAdapter (31 tests), CodeReviewPainAdapter (18 tests),\n  WritingPain\n[…]\nirectory, and extract seedTestDb() helper to reduce duplication.\n\n---------\n\nCo-authored-by: Test Coverage Bot <test-coverage-bot@principles.dev>\nCo-authored-by: PD <csuzngjh@users.noreply.github.com>",
          "is_bot": false,
          "headline": "test: add coverage for untested core modules and adapters (#1228)",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-16T01:18:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "963268fd231025b1b3feac8b5020cba5b4e0b02a",
          "body": "* test: add missing test coverage for core modules\n\nAdd comprehensive test coverage for high-risk areas:\n\n1. **evolution-store.ts** (23 tests):\n   - listEvolutionTasks: filtering by status, type, pagination, ordering\n   - getEvolutionTask: retrieval by task ID, error handling\n   - Edge cases: missin\n[…]\n to \\| and newline is replaced (not just that table rows exist).\n\n---------\n\nCo-authored-by: Test Gap Analyzer <test-gap-analyzer@principles.dev>\nCo-authored-by: PD <csuzngjh@users.noreply.github.com>",
          "is_bot": false,
          "headline": "test: add missing test coverage for core modules (#1218)",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-16T01:08:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ae561401a6e9d9cdc3a735c65d3339af81efa4c9",
          "body": "Co-authored-by: AI Assistant <ai-assistant@principles.local>",
          "is_bot": false,
          "headline": "docs: add cloud PD quality handoff (#1231)",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-16T00:58:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c056b641b45b798c6552a7d3b853fccf5de8c1e8",
          "body": "* fix(openclaw-plugin): capture current prompt turn\n\n* test(openclaw-plugin): remove ignored characterization input\n\n* fix(openclaw-plugin): minimize session ids in logs\n\n* fix(openclaw-plugin): retain retry after signal failure\n\n---------\n\nCo-authored-by: AI Assistant <ai-assistant@principles.local>",
          "is_bot": false,
          "headline": "fix(openclaw-plugin): capture current prompt turn (#1230)",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-16T00:51:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b913224c734108a9b85ee14e596b3a0bf80bba95",
          "body": "…il-works/pi-ai-0.80.6\n\nchore(deps): bump @earendil-works/pi-ai from 0.79.4 to 0.80.7",
          "is_bot": false,
          "headline": "Merge pull request #1226 from csuzngjh/dependabot/npm_and_yarn/earend…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-16T00:11:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4a7461363c9d73c25c1a05cbf5d33e56d831c3e2",
          "body": "pi-ai 0.80 moved getModel/getProviders/completeSimple into the /compat subpath. Update L2AgentLoopAdapter imports and vi.mock path so tsc and unit tests pass against 0.80.x.",
          "is_bot": false,
          "headline": "fix(adapter): migrate pi-ai imports to /compat for 0.80 compat",
          "author_name": "AI Assistant",
          "author_login": null,
          "committed_at": "2026-07-16T00:00:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4ff53b86376a4b26e33e4fb48aaf30296718635c",
          "body": "Bumps [@earendil-works/pi-ai](https://github.com/earendil-works/pi/tree/HEAD/packages/ai) from 0.79.4 to 0.80.7.\n- [Release notes](https://github.com/earendil-works/pi/releases)\n- [Changelog](https://github.com/earendil-works/pi/blob/main/packages/ai/CHANGELOG.md)\n- [Commits](https://github.com/eare\n[…]\nency-name: \"@earendil-works/pi-ai\"\n  dependency-version: 0.80.6\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump @earendil-works/pi-ai from 0.79.4 to 0.80.7",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-15T15:48:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "06fb7b014f4b907c2631d604bfb0d407100e663b",
          "body": "Bumps [semver](https://github.com/npm/node-semver) from 7.8.4 to 7.8.5.\n- [Release notes](https://github.com/npm/node-semver/releases)\n- [Changelog](https://github.com/npm/node-semver/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/npm/node-semver/compare/v7.8.4...v7.8.5)\n\n---\nupdated-depende\n[…]\nirect:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump semver from 7.8.4 to 7.8.5 (#1224)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-15T15:46:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b1d0a2b5780489257e405ad7a67a825fe781c842",
          "body": "Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 26.1.0 to 26.1.1.\n- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)\n- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)\n\n---\nupdated-depe\n[…]\ndate:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>\nCo-authored-by: PD <csuzngjh@hotmail.com>",
          "is_bot": true,
          "headline": "chore(deps-dev): bump @types/node (#1219)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-15T15:17:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c6d335cd414bc3dbe1c56b70aa8956dc9ee85fb7",
          "body": "Bumps [tsx](https://github.com/privatenumber/tsx) from 4.21.0 to 4.23.1.\n- [Release notes](https://github.com/privatenumber/tsx/releases)\n- [Changelog](https://github.com/privatenumber/tsx/blob/master/release.config.cjs)\n- [Commits](https://github.com/privatenumber/tsx/compare/v4.21.0...v4.23.1)\n\n--\n[…]\ndate:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>\nCo-authored-by: PD <csuzngjh@hotmail.com>",
          "is_bot": true,
          "headline": "chore(deps-dev): bump tsx from 4.21.0 to 4.23.1 (#1227)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-15T15:09:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e766b1bd199bd7812b7f5efc0bb9ae18ddeb6de1",
          "body": "Bumps [tailwindcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss) from 4.3.1 to 4.3.2.\n- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)\n- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)\n- [Commits](https://github.co\n[…]\ndate:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>\nCo-authored-by: PD <csuzngjh@hotmail.com>",
          "is_bot": true,
          "headline": "chore(deps): bump tailwindcss from 4.3.1 to 4.3.2 (#1225)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-15T15:04:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "202bd20e29c414f910f91bbfbf2ff297516895e8",
          "body": "---\nupdated-dependencies:\n- dependency-name: tar\n  dependency-version: 7.5.20\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>\nCo-authored-by: PD <csuzngjh@hotmail.com>",
          "is_bot": true,
          "headline": "chore(deps): bump tar in /packages/create-principles-disciple (#1220)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-15T14:59:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "df30f2a3f357b1a80433ef8c35b10b34c73e062e",
          "body": "---\nupdated-dependencies:\n- dependency-name: semantic-release\n  dependency-version: 25.0.7\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>\nCo-authored-by: PD <csuzngjh@hotmail.com>",
          "is_bot": true,
          "headline": "chore(deps-dev): bump semantic-release from 25.0.5 to 25.0.7 (#1221)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-15T12:21:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0179f816f23f72851eeb959201be6ec3890af7a6",
          "body": "…/513 (#1229)\n\n* docs(specs): add progressive disclosure design review for PRI-511/512/513\n\n评审信息共享池三层级工单的设计方案,基于 2026 业界上下文工程共识提出渐进式披露替代方案。\n\n识别工单方案的 5 个根本问题:违背最小高信号集合原则、未讨论写入时冗余 vs 读取时回溯、无 token 预算管理、无相关性排序、与代码现状的事实偏差。\n\n替代方案:三层信息披露架构(TL;DR / 结构化摘要 / 原始详情)+ ContextManifest 声明式需求 + PromptBudgetManager\n[…]\n。\n\n7. [中等] 补全 extractScribeArtifactId 的 sourceScribeArtifactId fallback 描述。\n\n新增 §11 自检评审修正日志,完整记录 v1→v2 的修正内容和仍需 Owner 判断的开放问题。\n\n---------\n\nCo-authored-by: AI Assistant <ai-assistant@principles.local>",
          "is_bot": false,
          "headline": "docs(specs): add progressive disclosure design review for PRI-511/512…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-15T09:43:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7bdbeb1954bf49832b70b8af4f6111ac35ef99b8",
          "body": "…ion_observer (#1212)\n\n* fix(config): switch MVP default runtime to openclaw + disable correction_observer\n\nProblem: MVP installs default to pd.default (pi-ai) profile whose provider/model/apiKeyEnv are empty placeholders, leaving the runtime in needs_setup state immediately after install. The plugi\n[…]\nrver enabled:false\n\nVerification:\n- Each affected test file run individually: all pass\n- tsc --noEmit: 0 errors (core + pd-cli)\n\n---------\n\nCo-authored-by: AI Assistant <ai-assistant@principles.local>",
          "is_bot": false,
          "headline": "fix(config): switch MVP default runtime to openclaw + disable correct…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-12T14:35:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "36fddb45272221f4a42199952f6f86a55d7a1448",
          "body": "…e (#1211)\n\n* test(core): add unit tests for principle-injector and trajectory-store\n\nAdds 31 new unit tests covering 2 high-value core modules that previously lacked dedicated test coverage:\n\n1. principle-injector (16 tests):\n   - formatForInjection: basic formatting, empty text\n   - getRelevantPri\n[…]\ncation:\n- tsc --noEmit: 0 errors (was 38)\n- eslint: 0 errors (was 3)\n- npm run build: success\n- New tests: 31/31 pass (16 + 15)\n\n---------\n\nCo-authored-by: AI Assistant <ai-assistant@principles.local>",
          "is_bot": false,
          "headline": "test(core): add unit tests for principle-injector and trajectory-stor…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-12T12:22:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8d3bf660ee320e1d2508611bd7248cad76c948a9",
          "body": "…ion (>=2026.4.4) (#1207)\n\n* fix(plugin): auto-configure allowConversationAccess + fix compat version\n\ncompat.pluginApi was exact '2026.4.4', blocking plugin load on OpenClaw 2026.6.11.\n\nChanged to semver range '>=2026.4.4' so the plugin loads on newer hosts.\n\nAdded postinstall script (scripts/posti\n[…]\nr variables and unused openSync/closeSync imports.\n\n---------\n\nCo-authored-by: AI Assistant <ai-assistant@principles.local>\nCo-authored-by: Post-Commit Checker <ai-postcommit-checker@principles.local>",
          "is_bot": false,
          "headline": "fix(plugin): auto-configure allowConversationAccess + fix compat vers…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-11T14:22:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5744cd2bd6ee15f4a991a045c2cab3a7535d9cd7",
          "body": "…g-mask, and workflow-funnel-loader (#1209)\n\n* test(core): add dedicated unit tests for bridge-result-shaper, pruning-mask, and workflow-funnel-loader\n\nAdds 62 new unit tests covering 3 high-value core modules that previously\nlacked dedicated test coverage:\n\n1. bridge-result-shaper (17 tests):\n   - \n[…]\nlows. Add regression test for the double-failure scenario.\n\n---------\n\nCo-authored-by: Test Coverage Bot <test-coverage-bot@principles.dev>\nCo-authored-by: AI Assistant <ai-assistant@principles.local>",
          "is_bot": false,
          "headline": "test(core): add dedicated unit tests for bridge-result-shaper, prunin…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-10T12:54:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d676e36ffb0b5eb110a7aa378a740bb510e38c6b",
          "body": "…xes (#1204)\n\n* test: fill regression test gaps for recent security and validation fixes\n\nCovers 4 high-risk areas identified in the last 20 merged commits:\n\n1. principle-tree-ledger atomicWriteFileSync (commit 105aa921):\n   - Verifies no predictable .tmp file remains after writes\n   - Verifies .pd-\n[…]\nction instead of claiming to test env var behavior\n\n* fix: remove unused beforeEach/afterEach imports flagged by CodeQL\n\n---------\n\nCo-authored-by: Test Coverage Bot <test-coverage-bot@principles.dev>",
          "is_bot": false,
          "headline": "test: fill regression test gaps for recent security and validation fi…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-08T15:45:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cdf25a78164cb4ec5ca9a7ae9c1a8f1c83df8b2f",
          "body": "…es (#1194)\n\n* test(pd-console): add coverage for workspaces and update-history routes\n\nAdd comprehensive test coverage for two previously untested server routes:\n\n- Workspaces API (GET/POST/PATCH/DELETE /api/workspaces, POST /sync):\n  covers input validation (name length, slashes, path emptiness),\n\n[…]\nlock down the validation contract.\n- Malformed update-history files previously had no regression guard\n  for the graceful-degradation path.\n\n* test(pd-console): fix import order in update-history test",
          "is_bot": false,
          "headline": "test(pd-console): add coverage for workspaces and update-history rout…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-08T15:36:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8b596746b2d72c1cb59983aec948a45557803d10",
          "body": "…#1206)\n\nPR #1200 bumped react-dom to 19.2.7 but left react at 19.2.6, causing npm to\n\ninstall duplicate copies (root 19.2.6 as peer, nested 19.2.7 for pd-console).\n\nesbuild bundles both copies, leading to: pageerror: Cannot read properties of\n\nnull (reading 'useMemo') in all 17 smoke-all-pages e2e tests.\n\nFix: bump react to ^19.2.7 in pd-console + scaffold template, and manually\n\ndedupe the lock file to hoist a single react@19.2.7 + react-dom@19.2.7 to root.",
          "is_bot": false,
          "headline": "fix(console): align react to 19.2.7 to dedupe with react-dom 19.2.7 (…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-08T15:16:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cd8e748408902d294936d90e254b94c943dcd782",
          "body": null,
          "is_bot": false,
          "headline": "fix(ci): build principles-core before regression e2e tests (#1205)",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-08T12:56:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bba3123b7553a10b27258d19c26f6cd23fe3f897",
          "body": "…tree-ledger (#1203)\n\n* test(core): pin atomic-write + lock hardening contract for principle-tree-ledger\n\nPR #1179 (fix(security): resolve CodeQL insecure-temporary-file alerts\nin principle-tree-ledger) added three security-relevant behaviors without\ndedicated regression tests:\n\n  1. atomicWriteFile\n[…]\nnd applies the prefix filter, then replace the\nthree inline call sites.\n\nNo behavior change; same 8 tests pass.\n\n---------\n\nCo-authored-by: PD Test Gap Analyzer <ai-test-gap-analyzer@principles.local>",
          "is_bot": false,
          "headline": "test(core): pin atomic-write + lock hardening contract for principle-…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-08T12:27:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c1da60d4e2cd156668552b662f698c76d3909c9f",
          "body": "Bumps [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) from 1.14.0 to 1.23.0.\n- [Release notes](https://github.com/lucide-icons/lucide/releases)\n- [Commits](https://github.com/lucide-icons/lucide/commits/1.23.0/packages/lucide-react)\n\n---\nupdated-dependencies:\n-\n[…]\ndate:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>\nCo-authored-by: PD <csuzngjh@hotmail.com>",
          "is_bot": true,
          "headline": "chore(deps): bump lucide-react from 1.14.0 to 1.23.0 (#1202)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-08T12:22:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "99fb292963de8033175fed8eaf813fad656e03e6",
          "body": "Bumps [fs-extra](https://github.com/jprichardson/node-fs-extra) from 11.3.5 to 11.3.6.\n- [Changelog](https://github.com/jprichardson/node-fs-extra/blob/master/CHANGELOG.md)\n- [Commits](https://github.com/jprichardson/node-fs-extra/compare/11.3.5...11.3.6)\n\n---\nupdated-dependencies:\n- dependency-name\n[…]\ndate:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>\nCo-authored-by: PD <csuzngjh@hotmail.com>",
          "is_bot": true,
          "headline": "chore(deps): bump fs-extra from 11.3.5 to 11.3.6 (#1201)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-08T12:17:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "637aba879139314d904c4ffce20db3788cdfad08",
          "body": "Bumps [react-dom](https://github.com/facebook/react/tree/HEAD/packages/react-dom) from 19.2.6 to 19.2.7.\n- [Release notes](https://github.com/facebook/react/releases)\n- [Changelog](https://github.com/react/react/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/facebook/react/commits/v19.2.7/pa\n[…]\ndate:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>\nCo-authored-by: PD <csuzngjh@hotmail.com>",
          "is_bot": true,
          "headline": "chore(deps): bump react-dom from 19.2.6 to 19.2.7 (#1200)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-08T12:11:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6c03b9064305895548bd750615b5f769bc3a9777",
          "body": "Bumps [@radix-ui/react-tooltip](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/tooltip) from 1.2.10 to 1.2.11.\n- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/tooltip/CHANGELOG.md)\n- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages\n[…]\ndate:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>\nCo-authored-by: PD <csuzngjh@hotmail.com>",
          "is_bot": true,
          "headline": "chore(deps): bump @radix-ui/react-tooltip from 1.2.10 to 1.2.11 (#1199)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-08T00:43:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "779e8fba13e6da2d2f3a3f1736d92677667a0390",
          "body": "Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 8.61.0 to 8.62.1.\n- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)\n- [Changelog](https://github.com/typescript-eslint/typescript-es\n[…]\ndate:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>\nCo-authored-by: PD <csuzngjh@hotmail.com>",
          "is_bot": true,
          "headline": "chore(deps-dev): bump @typescript-eslint/eslint-plugin (#1198)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-08T00:37:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1386ac5533b63e709bb75c65418ce7ade257bf03",
          "body": "Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 26.0.1 to 26.1.0.\n- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)\n- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)\n\n---\nupdated-depe\n[…]\ndate:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>\nCo-authored-by: PD <csuzngjh@hotmail.com>",
          "is_bot": true,
          "headline": "chore(deps-dev): bump @types/node (#1197)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-08T00:31:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d2d718b2e25f78807d080e6680a8082feb4c1c9b",
          "body": "…1196)\n\nBumps [fs-extra](https://github.com/jprichardson/node-fs-extra) from 11.3.5 to 11.3.6.\n- [Changelog](https://github.com/jprichardson/node-fs-extra/blob/master/CHANGELOG.md)\n- [Commits](https://github.com/jprichardson/node-fs-extra/compare/11.3.5...11.3.6)\n\n---\nupdated-dependencies:\n- depende\n[…]\ndate:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>\nCo-authored-by: PD <csuzngjh@hotmail.com>",
          "is_bot": true,
          "headline": "chore(deps): bump fs-extra in /packages/create-principles-disciple (#…",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-08T00:25:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ac421e3cf3e1df33c7eb01a46043aadace70e948",
          "body": "…195)\n\nBumps [js-yaml](https://github.com/nodeca/js-yaml) from 5.2.0 to 5.2.1.\n- [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md)\n- [Commits](https://github.com/nodeca/js-yaml/compare/5.2.0...5.2.1)\n\n---\nupdated-dependencies:\n- dependency-name: js-yaml\n  dependency-version: 5.\n[…]\nirect:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump js-yaml in /packages/create-principles-disciple (#1…",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-08T00:10:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2bae4e31fd6ef24dc135171fdfae1bf728dd3862",
          "body": "… npm registry has no @csuzngjh scope (#1193)\n\nRoot cause: commit 0d5aebee renamed packages/openclaw-plugin/package.json name from 'principles-disciple' to '@csuzngjh/principles-disciple', but the npm registry only has the unscoped package (published by npm user 'principles-disciple', currently at v\n[…]\nn (auto-regenerated by npm install)\n\nTests: npm run build succeeds for @principles/core, principles-disciple, @principles/pd-cli; mvp-config.test.ts 217 tests pass; runtime-init.test.ts 14 tests pass.",
          "is_bot": false,
          "headline": "fix(publish): revert package name to principles-disciple (no scope) —…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-05T14:17:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d8b67c58bf84690dba096c3e9abd52c459f2cb45",
          "body": "Commit e22e1c68 (ci: migrate to npm Trusted Publishing) accidentally removed the env: NODE_AUTH_TOKEN from the Publish to npm step, mistaking --provenance as replacing auth. --provenance only generates provenance statements via OIDC; the publish operation itself still requires a NODE_AUTH_TOKEN.\n\nSy\n[…]\nAI never repeats the same mistake.' Previous descriptions were too technical ('Evolutionary programming agent framework with strategic guardrails and reflection loops.') for ClawHub marketplace users.",
          "is_bot": false,
          "headline": "fix(ci): restore NODE_AUTH_TOKEN env on Publish to npm step (P0) (#1192)",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-04T23:41:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "13f6e3222e69c1a2e20dad6570179411ae2d349d",
          "body": "…gin (#1191)\n\n* fix(publish): add prepack hook and refresh manifest fingerprint for npm publish\n\nGA workflow's build step only runs tsc, which produces dist/*.js but NOT dist/bundle.js (the plugin's setupEntry). Without prepack, the published npm tarball would be missing bundle.js, making @csuzngjh/\n[…]\n 1.196.1, and publishes @csuzngjh/principles-disciple@1.196.1 — version detaches from source.\n\nFixed 5 sites: workflow_dispatch default, options list, case branch, matrix echo, and check_and_add call.",
          "is_bot": false,
          "headline": "fix(publish): enable npm + ClawHub dual-channel publishing for PD plu…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-04T23:27:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f9dc8b9f7aec9d859a6227c0b2f75b779e497c13",
          "body": "… instead of 404 for missing principle (PRI-515) (#1190)\n\nBrowser auto-logs 404 network responses to console, which frontend try/catch cannot suppress. Return 200 with the same insufficientData shape the model layer already uses for principles without rules, so the frontend needs only one rendering path.\n\nERR-002/074/089 — EP-03 graceful degradation with structured reason, branch coverage parity.",
          "is_bot": false,
          "headline": "fix(console): DEFECT-006 lifecycle API returns 200 + insufficientData…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-04T14:30:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "566bb3b890939c3f26508b77f90f632a51421b7b",
          "body": "…sons sibling dreamer seed (PRI-514) (#1189)\n\nPreviously a single defer candidate refused by the admission gate set a\nglobal intakeFailed flag that gated the ENTIRE dreamer seed loop,\nskipping dreamer seed for all sibling candidates that succeeded intake\n(principle/rule/prompt). This is an EP-03 / E\n[…]\nefused + principle/rule/prompt consumed ->\nall 3 still dreamer_seeded), DEFECT-005-B (all intake_failed -> 0\ndreamer_seeded boundary). Full diagnose suite (43 tests) + pd-cli\nsuite (1367 tests) green.",
          "is_bot": false,
          "headline": "fix(diagnose): DEFECT-005 defer candidate intake_failed no longer poi…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-04T14:24:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d6e2a1f77ddeda8150f5d874fe8998c72c37db12",
          "body": "…th (#1188)\n\n* fix(pri-510): wire EvaluatorRunner repair loop into CLI production path\n\nEP-02 (Production Path Wiring): PRI-509 added isRepairLoopEnabled and seedArtificerRepairTask deps to EvaluatorRunnerDeps (core), but the two CLI production paths (runtime-internalization-run-once.ts and rulehost\n[…]\nemp dir creation as insecure (path-prediction risk). Switch to fs.mkdtempSync which is atomic and unpredictable. Both createTempWorkspace and the malformed-config test updated. Tests still pass (7/7).",
          "is_bot": false,
          "headline": "fix(pri-510): wire EvaluatorRunner repair loop into CLI production pa…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-04T11:38:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "33ac0aa7e780783d299d0282c7be0d78755b295d",
          "body": "…#1187)\n\n* chore(website): add Cloudflare Web Analytics beacon\n\nInject the privacy-first Cloudflare Web Analytics beacon into the VitePress head config so all 31 generated HTML pages carry the snippet.\n\nToken: 17b7954b9e24419198b8837990ddb022 (public, embedded in HTML by design)\n\n* chore(website): a\n[…]\nide)\n\n- cta_read_install_guide (InstallSection)\n\n- outbound_click (ClosingSection GitHub link)\n\nImplementation uses pure HTML data-umami-event attributes (zero JS code, auto-captured by Umami script).",
          "is_bot": false,
          "headline": "chore(website): add Cloudflare Web Analytics + Umami event tracking (…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-04T10:43:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b43c138ed45bbfa9f7afeed86f8eb1ca7d230656",
          "body": "* feat(pri-509): evaluator-artificer repair loop with 2-round cap\n\nImplements the evaluator-to-artificer repair loop as 5 TDD vertical slices:\n\nSlice 1: register feature flag evaluator_artificer_repair_loop (quiet, default off, 2026-07-04).\n\nSlice 2: artificer-prompt-builder accepts optional repairF\n[…]\nd RepairPayload type instead of duplicating the shape inline (prevents drift).\n\nAll 116 tests pass (49 pitask-metadata + 60 artificer-runner-vslice + 7 evaluator-repair-loop). Lint clean. Build clean.",
          "is_bot": false,
          "headline": "feat(pri-509): evaluator-artificer repair loop with 2-round cap (#1186)",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-04T09:52:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a158e8eca3215499940633e830025ffd4a92982c",
          "body": "Broaden ERR-083 to include package identity (name field) as a shared\n\ncontract — package rename must propagate to CI workflow --workspace refs.\n\nAdd recurrences:\n\n- ERR-002: readCoreVersion silent catch hid missing ./package.json export\n\n- ERR-088: markRetried multi-row UPDATE + failed-tasks pagination signal\n\nUpdate EP-02 card with package identity change guidance.",
          "is_bot": false,
          "headline": "docs(error-handbook): record PR #1182 review findings (#1185)",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-04T07:45:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "10607949fe0a8de6249fa2a6aa00c8801fa4c2e2",
          "body": "… capability boundary (#1184)\n\n* feat(pri-508): artificer dreamer 5-dim context passthrough + RuleHost capability boundary\n\nRoot cause: artificer only sees scribe's compressed principleDraft, loses dreamer 5-dim candidate (badDecision/betterDecision/rationale/riskLevel/strategicPerspective). artific\n[…]\niskLevel/strategicPerspective) absent → still resolves\n\nartificer-runner.ts line coverage: 68.33% → 86.85%. All 56 tests in\n\nartificer-runner-vslice.test.ts pass; full suite 6221 passed, 0 regression.",
          "is_bot": false,
          "headline": "feat(pri-508): artificer dreamer 5-dim context passthrough + RuleHost…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-04T07:04:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0d5aebee72cfef11c0278f42243421484c7e2b25",
          "body": "…iled tasks UI (#1182)\n\n* chore: restore user package.json name + add bug_report.yml template\n\n* feat(feedback-pipeline): observability — dead letter, agent draft, failed tasks UI\n\nSpec: .trae/specs/feedback-pipeline-observability\n\nCore:\n\n- Add SqliteDeadLetterStore + dead_letter_pains table (rc-9: \n[…]\nbody by ENCODED length (1800) not raw length (4000) -- encodeURIComponent can 3x expand, risking Outlook's ~2000-char mailto limit\n\n- mailto-url.test: update assertions to verify encoded-length budget",
          "is_bot": false,
          "headline": "feat(feedback-pipeline): observability — dead letter, agent draft, fa…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-04T06:55:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9872c478b0d767afadb1ab9bfaf481858bdd3116",
          "body": "* fix(platform): make scripts cross-platform for Linux/macOS\n\nReplace Windows-only PowerShell scripts with Node.js (.mjs) unified versions that work on all platforms. The .ps1 files are kept as 1-line wrappers for backward compatibility.\n\n- setup-private-docs-symlink.mjs: cross-platform junction/sym\n[…]\nmove unused isWin variable\n\n2. setup-worktree.mjs: remove unused os import\n\n3. install-hooks.mjs: replace existsSync+readFileSync with try/catch to\n\n   eliminate TOCTOU race condition (CodeQL finding)",
          "is_bot": false,
          "headline": "fix(platform): make scripts cross-platform for Linux/macOS (#1183)",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-04T06:48:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "357933804c34c0b3dc28ef6bffd252dc00f75ff5",
          "body": "…e coverage) (#1181)",
          "is_bot": false,
          "headline": "docs(err-089): record PRI-442 PR #1180 recurrence (boolean-OR sub-cas…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-04T01:21:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "efb9af2ce3c4f08503a1c5bbdec619a737d17701",
          "body": "…ure (rc-9) (#1180)\n\n* test(pri-442): A-09 add failing test for rc-9 observability on non-write-tool rejection\n\nRED commit for PRI-442 A-09 rc-9-no-silent-fallback.\n\nAsserts that when a non-WRITE_TOOL FAILURE is rejected at the tool-name\ngate, evaluatePainAdmissionForToolCall emits a structured obse\n[…]\nently (CodeRabbit nitpick)\n\nReplace (SystemLogger.log as ReturnType<typeof vi.fn>) with\nvi.mocked(SystemLogger.log) at 2 sites for consistency with line 89\nand to avoid the as-bypass pattern per rc-2.",
          "is_bot": false,
          "headline": "fix(pri-442): A-09 emit PAIN_ADMISSION_SKIPPED on non-WRITE_TOOL fail…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-04T01:16:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "105aa921356c0b77b68d12b4fe5c6840c96a5d37",
          "body": "…iple-tree-ledger (#1179)\n\n* fix(security): resolve CodeQL insecure-temporary-file alerts in principle-tree-ledger\n\natomicWriteFileSync: replace predictable '.tmp' suffix with mkdtempSync-generated unique temp directory in the same filesystem as the target. Prevents symlink-attack and predictable-na\n[…]\ne + rename + retry into a try block and cleanup into the\nfinally block guarantees tmpDir is always removed on every exit path —\nincluding early writeFileSync failures that previously bypassed cleanup.",
          "is_bot": false,
          "headline": "fix(security): resolve CodeQL insecure-temporary-file alerts in princ…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-03T14:06:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6cc037cb10dfc85fa4e88df646f97c4a058637a6",
          "body": "…llback (#1178)\n\nBug #1 fix (effectiveConfig extraction) in diagnose.ts/pain-retry.ts added no observability for the ok:false fallback path, violating rc-9-no-silent-fallback. Same class as the PRI-483/PR#1098 recurrence (loadPdConfig ok:false path). CodeRabbit caught the rc-9 violation + test gap; fixed in PR #1177 commit 642043a9. Updates ERR-002 Recurrence field.",
          "is_bot": false,
          "headline": "docs(err-002): record PRI-442 PR #1177 recurrence of silent config fa…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-03T12:45:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "023b5fdbc47f6773694976ff122ab0b41c05481d",
          "body": "…consistency (#1177)\n\n* fix(pri-442): wire effectiveConfig + sourcePainId + artificer prompt consistency\n\nBug #1: diagnose.ts and pain-retry.ts now extract effectiveConfig from configLoadResult and pass it to the 3 split-pipeline runners, so ADR-0019 LLM rate-limit degradation (isDegradationEnabled)\n[…]\nck only covered ok:true; add ok:false test asserting warn + defaults-based effectiveConfig\n\nTDD: RED (failing ok:false test) -> GREEN (add console.warn) -> REFACTOR (no extraction, 2 sites acceptable)",
          "is_bot": false,
          "headline": "fix(pri-442): wire effectiveConfig + sourcePainId + artificer prompt …",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-03T12:40:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1d23ff2d4cb49d2320a6a07d313807438af76710",
          "body": "…176)\n\n* feat(console): introduce slash commands step in onboarding wizard\n\nAdd Step 3 to the welcome wizard showing 7 core slash commands.\n\nRefactor commands from i18n array to TS module + flat i18n keys to comply with cr10-i18n-governance test.\n\nFix pollingError i18n key migration (step3 -> step4)\n[…]\n: progress.step4 was 'Invite' but step4 title is 'Ready to record real evidence'. Changed to 'Evidence'/'证据' to match step content and keep noun-label consistency with step1-3 (Welcome/Demo/Commands).",
          "is_bot": false,
          "headline": "feat(console): introduce slash commands step in onboarding wizard (#1…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-03T10:16:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0ec08231b94397a8d72fab718cf4db3ebc5292ff",
          "body": "…/505 (#1167)\n\nERR-089 recurrence: PRI-503 admission gate bypass in pain-retry/diagnose (sibling branch遗漏)\n\nERR-092 new: SystemLogger module-level cache leaks across workspaces (PRI-504)\n\nERR-040 recurrence: PRI-505 bundle-plugin.mjs missing dist/bundle.js check\n\nEP-07 broadened to cover module-level cache cross-workspace leakage pattern",
          "is_bot": false,
          "headline": "docs(err): record ERR-089/ERR-092/ERR-040 recurrences for PRI-503/504…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-03T07:58:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d77d453ccb0b4b74d4097ab009ba032e235b8ee0",
          "body": "…em root (#1175)\n\n* fix(runtime): guard mock-leak workspace paths from polluting filesystem root\n\nTest code historically uses Unix-style mock strings like '/fake/workspace' and '/mock/state' as mock workspaceDir values. On Windows, Node.js resolves these against the current drive letter — '/fake/wor\n[…]\n chore: suppress CodeQL false positives in io.ts and file-lock.ts\n\nBoth files write to paths alongside their target (not in os.tmpdir()),\nand file-lock.ts already uses O_EXCL for safe atomic creation.",
          "is_bot": false,
          "headline": "fix(runtime): guard mock-leak workspace paths from polluting filesyst…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-03T07:45:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "52bacd438e0daf00f34f52eef23c490c5e87858e",
          "body": "…(#1174)\n\n* fix(pri-442): close 3 internal-acceptance bugs (FINDING-002/003/004)\n\nFINDING-002: add PD_SKIP_GLOBAL_SHIM env var so smoke tests skip global\n\npd shim install (mirrors PD_SKIP_NPM_UPGRADE), avoiding host npm bin pollution.\n\nFINDING-003: clarify pd pain evidence docs — TRIGGER_DECISION en\n[…]\n finding (P3): Type.Union has 19 categories (incl. rate_limit),\n\nFAILURE_CATEGORY_MAP has 6 deduplicated user-facing values. Previous\n\ncomment said 18/9 due to pre-existing count drift, now corrected.",
          "is_bot": false,
          "headline": "fix(pri-442): close 3 internal-acceptance bugs (FINDING-002/003/004) …",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-03T05:29:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1ec781ddad54e4896d70bb6e4ddd2c50d79a8425",
          "body": "…or-host edge cases (#1173)\n\n* test: add coverage for contextInjection validation and signal-collector-host edge cases\n\n- Add 19 tests for contextInjection config validation (validateContextInjectionConfig, validateEvolutionContextConfig)\n- Add 15 new tests for signal-collector-host boundary conditi\n[…]\nrtion)\non line 256. The Record<string, unknown> type is directly assignable to\nPartialContextInjectionConfig, so the  cast is redundant.\n\n---------\n\nCo-authored-by: Trae Assistant <assistant@trae.dev>",
          "is_bot": false,
          "headline": "test: add coverage for contextInjection validation and signal-collect…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-03T05:21:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "233a6f1cc20fdafd3e71992e5695f295c5800d9b",
          "body": "…across P0-P3) (#1166)\n\n* fix(installer): unblock first-run onboarding via version, runtimeProfile, and detection fixes\n\nOnboarding flow review P0+P1 fixes for create-principles-disciple:\n\n- Fix-1 (P0): read version from package.json instead of hardcoded 2.0.0\n\n- Fix-4 (P0): prompt LLM runtimeProfil\n[…]\nL. If the file exists (pre-existing or created concurrently), EEXIST\n\nis caught and the existing config is preserved (PRI-308).\n\nAll 235 create-principles-disciple tests pass (mvp-config + installer).",
          "is_bot": false,
          "headline": "fix(onboarding): comprehensive first-run experience review (30 fixes …",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-03T05:15:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b2fc61a9ea2760384c61ec1741222f7f0bfe0929",
          "body": "…(#1168)\n\nExtract checkAdmissionGate from candidate.ts to shared admission-gate.ts helper. Apply gate check before intakeService.intake() in pain-retry.ts and diagnose.ts, mirroring candidate.ts (intake/repair/backfill).\n\nERR-089 recurrence: PR #1134 fixed candidate.ts but missed these two sibling b\n[…]\nre CLI commands from re-introducing the bypass.\n\ncli-5-failure-no-mutation: gate refusal does not call intake/update/ledger. cli-6-output-next-action: refusal result carries admissionBlock.nextAction.",
          "is_bot": false,
          "headline": "fix(pri-503): close admission gate bypass in pain-retry and diagnose …",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-03T05:10:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "502c76f4602e93d49134ace34522fd16726ab7ce",
          "body": "…-workspace leakage (#1171)\n\nERR-092 recurrence: cachedLogFile/cachedLogDate/lastCleanupDate were module-level let variables, so the first workspace to call log() pinned the log file path for ALL subsequent workspaces in the same Node.js process. Multi-workspace E2E isolation (PRI-442) was broken: w\n[…]\natch preserved as original fire-and-forget design; cache now correctly isolated before any failure). No .feature files affected. No new ERR registration (PR #1167 already recorded ERR-092 recurrence).",
          "is_bot": false,
          "headline": "fix(pri-504): key SystemLogger cache by workspaceDir to prevent cross…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-03T05:03:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "12c2d953b03125891c211d9096537013b283e20b",
          "body": "…only builds (#1172)\n\n* fix(pri-505): require dist/bundle.js in PLUGIN_REQUIRED to catch tsc-only builds\n\nERR-040 recurrence: PLUGIN_REQUIRED only checked for the 'dist' directory, not the specific 'dist/bundle.js' file. If a developer ran only 'tsc' without esbuild, dist/ would exist but bundle.js \n[…]\neserve .d.ts files\n\nbuild:bundle (esbuild) cleans dist/ directory. Running it after tsc destroys the .d.ts files generated by tsc, breaking pd-cli type checking. Reorder: build:bundle first, then tsc.",
          "is_bot": false,
          "headline": "fix(pri-505): require dist/bundle.js in PLUGIN_REQUIRED to catch tsc-…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-03T04:53:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "95bb0cfa0796f845cda97c717559b3b6c4dd8f2d",
          "body": "* docs(specs): security baseline design draft for MVP-Core hardening\n\n* docs(security): add SECURITY.md vulnerability disclosure policy\n\nSEC-BASE-1 supply chain control. SLA: ack 48h, high/critical fix 14d, medium/low 30d. Reports via GitHub Security Advisory only — no public issues.\n\n* ci(security)\n[…]\nts (rc-9-no-silent-fallback).\n\nP3 nitpick:\n\n- spec doc: fix markdown emphasis spacing (MD037) and add language tag to fenced code block (MD040).\n\nVerification: SEC-BASE-5 tests 3/3 pass, eslint clean.",
          "is_bot": false,
          "headline": "feat(security): establish PD security baseline (SEC-BASE-1~5) (#1170)",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-03T04:31:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1eeb864ae12255075efe01144d636244945cd7c8",
          "body": "…/pd-help listing (#1169)\n\n* fix(plugin): harden slash-command runtime validation and complete /pd-help listing\n\nFix P1 rc-1/rc-2 violations in /pd-thinking and /pd-workflow-debug:\n\n- thinking-os.ts: JSON.parse result now treated as unknown, validated via isRecord() before field access; readNumber()\n[…]\npd-help Chinese branch (language=zh) and English branch (language=en), asserting all 7 previously-missing commands now appear.\n\nTests: openclaw-plugin 1976 passed / 0 failed (was 1959, +17 new tests).",
          "is_bot": false,
          "headline": "docs(plugin): slash-command reference + fix rc-1/rc-2 violations and …",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-03T03:47:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d280ca845a97cad102c798ddf6f84de4e63f4a98",
          "body": "…(#1165)\n\nPR #1164 used workspaceDir.includes('e2e-workspace') to gate E2E pain\n\nadmission, which is the same root cause class as ERR-030 (path substring\n\nmatching causing unintended behavior switches). Fixed by switching to an\n\nexplicit env-var signal (PD_E2E_MODE=1).\n\nRecurrence update only — no new ERR entry.",
          "is_bot": false,
          "headline": "docs(err-030): record PR #1164 recurrence of path-substring matching …",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-03T02:00:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4326d052f4337568acb39b893ac36d34c50eaac4",
          "body": "…1164)\n\n* test(e2e): isolate workspace for E2E runs by running agent locally\n\n* fix(pr-review): gate E2E mode by env var, reuse BASH_TOOL_NAMES, isolate tsc\n\nAddress CodeRabbit P2/P3 findings on PR #1164:\n\n1. Replace workspaceDir.includes('e2e-workspace') with PD_E2E_MODE=1 env var (rc-9: avoid sile\n[…]\n[] and .includes() works. CI was green.\n\nERR checklist: rc-9 (no silent fallback — env var is explicit), rc-2 (no as bypass — none introduced).\n\nTests: openclaw-plugin 1962 passed; verify:merge green.",
          "is_bot": false,
          "headline": "test(e2e): isolate workspace for E2E runs by running agent locally (#…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-03T01:40:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1fd0ab852070a94d942eb3c3accf256ae2d069ad",
          "body": "CI checkout lacks lfs:true when tests read LFS-tracked binary assets — assertion fails on 132-byte pointer files. Found during PR #1159 review: verify-merge job's actions/checkout had default lfs:false, so homepage-contract.test.mjs size assertions failed on pointer files. Updates EP-06 pattern card with LFS checkout prevention rule.",
          "is_bot": false,
          "headline": "docs: add ERR-090 to error experience handbook (#1163)",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-02T14:33:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3ac37c3df0f8a293d31a9e4de3aaf12229f85941",
          "body": "…er density (#1159)\n\n* feat(website): redesign homepage — video hero, breathing motto, lighter density\n\nRestructure the homepage around the Owner-governed correction story while\nrestoring the visual simplicity and whitespace rhythm the redesign had lost.\n\nHero: replace the card-of-cards governance p\n[…]\ned explicit 'margin: 0' to .loop li and .trust-grid li to override the inherited rule, so all cards now have identical height.\n\n* fix(website): address CodeRabbit review findings and fix CI merge gate",
          "is_bot": false,
          "headline": "feat(website): redesign homepage — video hero, breathing motto, light…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-02T14:20:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "49c1f07a6ac0046b4c3cd04b818bb53b5c8e2da0",
          "body": "…PRI-501, PRI-502) (#1162)\n\n* feat(pd-console): pi-ai default runtime + Profile CRUD + i18n fixes (PRI-501, PRI-502)\n\n## Plan C: 全切 pi-ai + 完整 onboarding\n\n### Step 1-2: 默认 runtime profile 切换到 pi-ai (PRI-501 修复)\n\n- pd-config-defaults.ts: 新增 pd.default (pi-ai placeholder) + 保留 openclaw.default (fallba\n[…]\nion pass it through\n\n- runtime-adapter-resolver.ts: pass configFields.systemPrompt to PiAiRuntimeAdapter\n\nTests: TC1-TC3 (adapter Context), TC4-TC5 (config profile flow). All existing tests unchanged.",
          "is_bot": false,
          "headline": "feat(pd-console): pi-ai default runtime + Profile CRUD + i18n fixes (…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-02T14:04:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "84da484a9adce5f341fc83755384708162148eaa",
          "body": "PRI-496: document perf contract thresholds (200ms/500ms) + baseline JSON\n\nPRI-497: duplicate_active_activation recorded in skippedActivations + gate.ts legacy fallback includes skippedActivations:[]\n\nPRI-498: v2 Artificer prompt forbids all 3 unsupported action types (propose_correction, requireAppr\n[…]\n principleId via extractPrincipleId; new contract test locks alignment; fix 3 missed test fixtures (cr10-api-validators, governance-approve-activation integration, activations-disable type annotation)",
          "is_bot": false,
          "headline": "fix(pri-496-500): RuleHost seed-MVP audit findings (#1160)",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-02T05:43:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c54d4b52ab3b78b0ec33d3bfaa2d03d0f01660f4",
          "body": "- actions/checkout@v6: add lfs: true to pull real mp4/webp content (not 130-byte pointers)\n\n- add 'Verify LFS assets pulled' step: fail loud if mp4 <1KB (rc-3-fail-loud-missing)\n\n- prevents website video playback failure after Phase B-C LFS history migration",
          "is_bot": false,
          "headline": "fix(website): pull Git LFS assets in Cloudflare Pages deploy CI (#1158)",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-02T02:12:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8758c23581a0d10e060605951ec5e556be4a2630",
          "body": "… CI size guard (#1156)\n\n- .gitattributes: track *.mp4/*.webm/*.webp via Git LFS\n\n- .gitignore: exclude large binaries (*.tar, *.exe, *.dll) and packages/*/logs/\n\n- scripts/check-repo-hygiene.js: add checkLargeFiles() — block >5MB non-LFS files\n\n- .github/workflows/repo-health.yml: CI guard — 200MB \n[…]\ny hook)\n\n- scripts/install-hooks.ps1: idempotent hook installer with bash fallback (Trae .git protection)\n\n- scripts/post-checkout-worktree.sh: hook fragment — auto-run setup-worktree.ps1 in worktrees",
          "is_bot": false,
          "headline": "chore(repo): hardening — LFS config, large-file guard, worktree hook,…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-02T01:51:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "78f56f9b99982dfe3d6e54febc2d46fa7b528e5e",
          "body": "…command fix (#1155)\n\n* docs(pri-495): rulehost seed-mvp release playbook + rollback + stale-command fix\n\nPRI-495 (P2): seed-user RuleHost release smoke + rollback playbook.\n\nChanges:\n\n- New docs/runbooks/ops/rulehost-seed-mvp-playbook.md: seed-MVP release playbook with 10 positive / 10 negative smo\n[…]\n2. Wrong event field: smoke checklist P5 used 'applicationMode'\n\n   but gate.ts recordRuleHostEvaluated uses 'activationMode'. Fixed\n\n   to match the actual RuleHostEvaluatedEventData interface field.",
          "is_bot": false,
          "headline": "docs(pri-495): RuleHost seed-MVP release playbook + rollback + stale-…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-02T01:01:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d38108d566710bf703edeaebd270d3e22e6f9340",
          "body": "…eueItem type (#1154)\n\n* refactor(plugin): merge queue-migration duplicate + unify EvolutionQueueItem type\n\nPR #1152 follow-up #1: collapse 4 divergent EvolutionQueueItem definitions into\n\nevolution-types.ts as single source of truth. Delete near-dead evolution-queue-migration.ts\n\n(only type-only im\n[…]\nc-9). Behavior change: malformed queue file no longer throws\n\ninto the outer catch (which would log as error); it now logs as warn + returns empty,\n\nmatching loadEvolutionQueue's established contract.",
          "is_bot": false,
          "headline": "refactor(plugin): merge queue-migration duplicate + unify EvolutionQu…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-02T00:28:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "17076101fac8aadb80c5b9be2ce2e3aa2dfa3657",
          "body": "… (#1153)\n\nIdempotent PowerShell script that prepares a fresh git worktree for PD\ndevelopment in one run. Solves the recurring 'new worktree is half-broken'\nclass of issues across Trae/Qoder/Gemini IDEs:\n\n- restores docs/.private junction (private docs access)\n- ensures node_modules + @types/node pr\n[…]\n;\nthe script itself is IDE-agnostic and unrelated to BDD. The accompanying\nimplementation-plan markdown was intentionally NOT extracted — plans/ is\ngitignored as local working state per .gitignore:72.",
          "is_bot": false,
          "headline": "chore(scripts): add setup-worktree.ps1 one-command worktree bootstrap…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-01T23:28:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4106b4d56a4aaa273db73d5498ff716fd966a734",
          "body": "* fix(f13): candidate-intake — validateRecommendation for untrusted JSON (rc-2)\n\ncandidate-intake-service had two as-unknown-as-Recommendation casts on\nuntrusted DB/LLM JSON (candidate.sourceRecommendationJson and\nartifact.contentJson), bypassing runtime validation (rc-2, ERR-001/ERR-005).\nA well-fo\n[…]\nL2Model's return + compat block still satisfy the installed\npi-ai. If a future bump adds a required field or changes Compat, this test goes\nred instead of the cast silently producing an invalid model.",
          "is_bot": false,
          "headline": "fix(f13): rc-2 合规清理 — candidate-intake + evolution-queue + 小项 (#1152)",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-01T14:04:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c719e269b95274d2a94e49e011284ccdf6e112dc",
          "body": "* docs(spec): add new user onboarding design spec\n\n* docs(spec): fix 6 deviations in onboarding design\n\n1. Add LLM config prerequisite (pd pain record needs provider/model/apiKeyEnv from .state/ runtime config, not .pd/config.yaml). Onboarding now has 5 steps with step 4 = LLM config.\n\n2. Fix demo s\n[…]\nin demo route\n\n* feat(onboarding): promote new_user_onboarding to MVP-Core/default-on\n\nMaintainer-approved (2026-07-01). Emergency disable via .pd/config.yaml: new_user_onboarding: { enabled: false }.",
          "is_bot": false,
          "headline": "feat: PD 新用户 onboarding (官网+installer+console /welcome) (#1146)",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-01T13:54:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2795aa08fab50326034545dbd8cb017125e77c2b",
          "body": "… config (#1151)\n\n* chore(pr-1134-followups): F7-6 dead code removal + F13 store fallback tests + R2-RH-001 runbook\n\n- F7-6: remove unused isRetryWaitStale (keep DEFAULT_RETRY_WAIT_STALE_TTL_MS, still used by read-model)\n- F13: add store-layer COALESCE fallback E2E tests on old-schema db (no CHECK)\n\n[…]\n6 barrel cap (300 lines)\n- prompt-characterization.test.ts: add version/features/runtimeProfiles/internalAgents to test YAML so validatePdConfig accepts the config and projectFocus:'full' takes effect",
          "is_bot": false,
          "headline": "feat(core): add contextInjection config with validation and effective…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-01T12:41:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e92feab80effe190a77f9e49adea25fe681ed8b6",
          "body": "…#1150)\n\nRecord ERR-001 recurrence found during PR #1149 code review.\n\nmakeHostInput() in rule-host-cache-invalidation.test.ts used as unknown as to bypass type checking. Fixture silently used rawParams (field not in contract) and bashRisk: { level: 'low' } (invalid enum). Fixed by removing cast and constructing the real RuleHostInput shape directly (rc-2-no-as-bypass).",
          "is_bot": false,
          "headline": "docs: update ERR-001 recurrence (PRI-494 as-bypass in test fixture) (…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-01T12:03:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "58215c8b5a9fbef3fcb5bf54d1aca0405dc51d3a",
          "body": "…trix (#1149)\n\n* test(rulehost): PRI-494 full-hook perf budget + cache invalidation matrix\n\nAdd 8 cache invalidation tests (promote/deactivate/content change/action\n\nchange/updateLogger/dispose) and 1 full-hook perf budget test with\n\nERR-088 execution proof (unique block marker). Fix existing perf t\n[…]\nerified in PRI-491 tests, not this file.\n\n3. [Nitpick] Extracted setupHostWithActivation() helper to reduce 3-line setup boilerplate repeated across 8 test cases.\n\nTests: 8/8 pass. tsc + eslint clean.",
          "is_bot": false,
          "headline": "test(rulehost): PRI-494 full-hook perf budget + cache invalidation ma…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-01T11:18:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "016303a7dd0643e1992edce3b8d6d43a2cb2fe4c",
          "body": "… R2-RH-001 runbook (#1148)\n\n* chore(pr-1134-followups): F7-6 dead code removal + F13 store fallback tests + R2-RH-001 runbook\n\n- F7-6: remove unused isRetryWaitStale (keep DEFAULT_RETRY_WAIT_STALE_TTL_MS, still used by read-model)\n- F13: add store-layer COALESCE fallback E2E tests on old-schema db \n[…]\n.\n- R2 (P3): guards.ts:177 section comment referenced deleted 'F7-6' follow-up id; kept PRI-442, retitled to 'Retry Wait Staleness TTL'.\n- R3 (P3): schema-conformance.test.ts missing trailing newline.",
          "is_bot": false,
          "headline": "chore(pr-1134-followups): F7-6 dead code + F13 store fallback tests +…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-01T09:55:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "088e94be3708e81ec118526b4b9db9e943df363e",
          "body": "…ge (#1147)\n\nExtract 4 Commander registration helpers from index.ts for parser-level testability (cli-7). Add 53 flag-wiring tests across 5 activation subcommands. Add 3 no-mutation tests for dispatch/deactivate failure paths (cli-5, ERR-088). Add 3 assembler fail-loud tests + 4 path normalization edge cases.",
          "is_bot": false,
          "headline": "test(rulehost): PRI-493 failure matrix + CLI/operator contract covera…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-01T09:40:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ea69515f99e0c58355e77f9c3086599eb923202f",
          "body": "…vailable (#1140)\n\nSignalCollectorHost refactor (PR #1132) replaced the old empathy keyword\nmatcher with a unified signal collection layer. When LLM is unavailable\n(the default config — signal_collector flag is enabled:false), ambiguous\nempathy keyword matches (e.g. '搞什么') were silently dropped inst\n[…]\nt: added regression test verifying empathy ambiguous keyword triggers\ntrackFriction when LLM is unavailable. Existing correction degraded test\nupdated to clarify it tests correction-specific dropping.",
          "is_bot": false,
          "headline": "fix(signal-collector): preserve empathy GFI accumulation when LLM una…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-01T09:22:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9416457e1019d798c6eef009f4fe0a43bd876fee",
          "body": "…gation (#1143)\n\n* docs: 信号关键词管理页设计文档 + BDD feature 文件\n\n* feat(pd-console): signal keywords management page with AgentCard action navigation\n\n- Add SignalKeywordsPage with KeywordListSection (search/filter/archive/delete), PendingTermsSection (batch confirm/ignore), and KeywordEditDialog (add keywor\n[…]\nsignalCollector string with AGENT_METADATA.signalCollector.name in ControlCenterPage\n- Test: Add reject-term-with-NaN-weight test case\n- Verify: tsc --noEmit 0 errors, vitest 1713+1 pass, lint 0 error",
          "is_bot": false,
          "headline": "feat(pd-console): signal keywords management page with AgentCard navi…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-01T07:37:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6276fbcacebe1b946cb6619d93f3cfe6d1bef0e1",
          "body": null,
          "is_bot": false,
          "headline": "docs: update ERR-075/ERR-001 recurrence records for PR #1143 (#1145)",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-01T07:24:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4d3ce4875c2c21548db32397aa43941d6659a2ac",
          "body": "Exercises the full RuleHost seed-MVP production chain from pain event to deactivation using only real services (runners, validators, approval queue, dispatcher, RuleHostWriter, RuleHost). The LLM adapter is the only test double (ScriptedAdapter pattern).\n\nChain: pain + Owner example IDs -> BehaviorE\n[…]\ns, shadow activation, shadow would-block observation, live block after promote, prior-read allow, flag-off suspension, deactivate stops enforcement, no fake E2E, negative assertion for shadow-vs-live.",
          "is_bot": false,
          "headline": "test(rulehost): PRI-492 full production E2E acceptance chain (#1144)",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-01T07:14:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fb09b4574ec640e8af29ec766f958ab80d44439f",
          "body": "Bumps [actions/github-script](https://github.com/actions/github-script) from 7 to 9.\n- [Release notes](https://github.com/actions/github-script/releases)\n- [Commits](https://github.com/actions/github-script/compare/v7...v9)\n\n---\nupdated-dependencies:\n- dependency-name: actions/github-script\n  depend\n[…]\ndate:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>\nCo-authored-by: PD <csuzngjh@hotmail.com>",
          "is_bot": true,
          "headline": "ci: bump actions/github-script from 7 to 9 (#1142)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-01T04:55:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "09156029d0bed46942e3b102b5269dd5c3f2acae",
          "body": "Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 4 to 7.\n- [Release notes](https://github.com/codecov/codecov-action/releases)\n- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/codecov/codecov-action/compare/v\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "ci: bump codecov/codecov-action from 4 to 7 (#1141)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-01T04:52:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a7a6e439abac2b233693d7962949a694cc8308cc",
          "body": "… and utilities (#1136)\n\n* test: add comprehensive boundary condition tests for signal-collector and utilities\n\n- SignalCollector: Added tests for empty/whitespace input, high-precision empathy, priority rules, case insensitivity, partial matches, special characters, and multi-term matching\n- Signal\n[…]\nomply with no-any coding guidelines\n- Fix case-insensitive test to use actual case-variant English keywords instead of identical Chinese inputs\n\n---------\n\nCo-authored-by: Test User <test@example.com>",
          "is_bot": false,
          "headline": "test: add comprehensive boundary condition tests for signal-collector…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-01T03:00:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "42f221fd004a0972777a54af066f30ff3945e8f0",
          "body": "* docs(spec): add SignalCollector unified detection design\n\nUpstream-merge correction+empathy detection into a framework-agnostic\nSignalCollector (core pure logic) + plugin I/O host. Local LLM (LMStudio)\nfirst with keyword degradation. Downstream strength-based routing\n(STRONG→diagnose via emitPainD\n[…]\nipt to fail before reaching console installation.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(core): use namespace import for js-yaml (compat v5 ESM) (#1138)",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-01T02:52:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "104524a8415ddb8a9e3d18ded2652a88eeb5117a",
          "body": "…37) (#1139)\n\nERR-001 recurrence: runtime-activation.ts and ActivationsConsoleModel.ts used 'parsed as Record<string, unknown>' to narrow JSON.parse(artifact.contentJson) — replaced with isRecord() type guard (rc-2-no-as-bypass).\n\nERR-083 broaden: PRI-491 changed ActivationRecord.status enum and add\n[…]\niting all cross-package consumers'. Updated EP-02 pattern card with new triggers for type-union changes and service method additions.\n\nStatistics: Recurring errors 40 -> 41 (ERR-083 first recurrence).",
          "is_bot": false,
          "headline": "docs: record ERR-001 recurrence + broaden ERR-083 for PRI-491 (PR #11…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-01T02:47:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "717ac694ff7e9bac387240d79588235fca74b240",
          "body": "…dence, and skip reasons (#1137)\n\n* feat(rulehost): PRI-491 owner observability for activation state, evidence, and skip reasons\n\nExtends RuleHost.evaluateDetailed() with skippedActivations: structured records for flag-off v2, unsupported action, unsupported context version, missing target_ref, cont\n[…]\ned_by_flag: rulecode_context_v2 is disabled or unavailable, skipping'. Also added the new recordRuleHostSkipped method to the eventLog mock to prevent TypeError when RuleHost._recordSkipped is called.",
          "is_bot": false,
          "headline": "feat(rulehost): PRI-491 owner observability for activation state, evi…",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-01T02:40:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "73e5d84dbcad8755931e5a22fee1372002765fc3",
          "body": "* docs(spec): add SignalCollector unified detection design\n\nUpstream-merge correction+empathy detection into a framework-agnostic\nSignalCollector (core pure logic) + plugin I/O host. Local LLM (LMStudio)\nfirst with keyword degradation. Downstream strength-based routing\n(STRONG→diagnose via emitPainD\n[…]\ned in\nprompt.ts. After SignalCollector refactor, that consumption moved to\nsignal-collector-host.ts (resolveObserverConfig with signal_collector\nflag). Updated test to verify the new consumption path.",
          "is_bot": false,
          "headline": "feat: SignalCollector 统一信号采集层(correction + empathy 上游融合) (#1132)",
          "author_name": "PD",
          "author_login": "csuzngjh",
          "committed_at": "2026-07-01T00:53:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        }
      ],
      "releases_count": 4,
      "commits_last_year": 1712,
      "latest_release_at": "2026-07-03T10:08:10Z",
      "latest_release_tag": "v1.75.1",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 20,
      "days_since_latest_release": 18,
      "mean_days_between_releases": 11.1
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 85,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "@principles/pd-cli",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@principles/pd-cli",
          "is_deprecated": false,
          "latest_version": "1.133.0",
          "repository_url": "https://github.com/csuzngjh/principles",
          "versions_count": 70,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 3628,
          "first_published_at": "2026-05-31T04:44:08.259000Z",
          "latest_published_at": "2026-06-27T07:27:39.861000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 24
        },
        {
          "name": "principles-disciple",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/principles-disciple",
          "is_deprecated": false,
          "latest_version": "1.197.13",
          "repository_url": "https://github.com/csuzngjh/principles",
          "versions_count": 232,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 17697,
          "first_published_at": "2026-03-15T10:25:53.521000Z",
          "latest_published_at": "2026-07-17T07:47:15.922000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 4
        },
        {
          "name": "@principles/core",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@principles/core",
          "is_deprecated": false,
          "latest_version": "1.240.10",
          "repository_url": "https://github.com/csuzngjh/principles",
          "versions_count": 197,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 19853,
          "first_published_at": "2026-05-31T04:42:48.365000Z",
          "latest_published_at": "2026-07-17T07:44:19.419000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 4
        },
        {
          "name": "create-principles-disciple",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "openclaw",
            "principles-disciple",
            "cli",
            "installer",
            "interactive"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/create-principles-disciple",
          "is_deprecated": false,
          "latest_version": "1.104.0",
          "repository_url": "https://github.com/csuzngjh/principles",
          "versions_count": 34,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 3522,
          "first_published_at": "2026-03-15T08:43:14.549000Z",
          "latest_published_at": "2026-07-03T03:50:29.627000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 18
        }
      ]
    },
    "popularity": {
      "forks": 1,
      "stars": 1,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2026-05-16",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 1,
        "total_forks": 1
      },
      "star_history": {
        "days": [
          {
            "date": "2026-06-22",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 1,
        "total_stars": 1
      },
      "open_issues_and_prs": 11
    },
    "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": [
        "packages/create-principles-disciple/tsconfig.json",
        "packages/openclaw-plugin/tsconfig.json",
        "packages/pd-cli/tsconfig.json",
        "packages/pd-console/tests/e2e/tsconfig.json",
        "packages/pd-console/tsconfig.json",
        "packages/principles-core/tsconfig.json",
        "scripts/nocturnal/tsconfig.json",
        "tests/e2e-fixtures/trap-01-circular-dep/tsconfig.json",
        "tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 200404,
      "source_files_sampled": 1463,
      "oversized_source_files": 16,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md",
        "GEMINI.md",
        "packages/create-principles-disciple/templates/langs/en/core/AGENTS.md",
        "packages/create-principles-disciple/templates/langs/zh/core/AGENTS.md",
        "packages/openclaw-plugin/src/core/AGENTS.md",
        "packages/openclaw-plugin/src/hooks/AGENTS.md",
        "packages/openclaw-plugin/templates/langs/en/core/AGENTS.md",
        "packages/openclaw-plugin/templates/langs/zh/core/AGENTS.md",
        "packages/website/video/homepage-demo/AGENTS.md",
        "packages/website/video/homepage-demo/CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 22917
    },
    "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": 161,
        "malicious_count": 0,
        "assessed_package": "npm:@principles/pd-cli@1.133.0",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "glob",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^13.0.6"
        },
        {
          "name": "@inquirer/prompts",
          "manifest": "packages/create-principles-disciple/package.json",
          "ecosystem": "npm",
          "version_constraint": "^8.4.3"
        },
        {
          "name": "commander",
          "manifest": "packages/create-principles-disciple/package.json",
          "ecosystem": "npm",
          "version_constraint": "^14.0.3"
        },
        {
          "name": "fs-extra",
          "manifest": "packages/create-principles-disciple/package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.3.6"
        },
        {
          "name": "js-yaml",
          "manifest": "packages/create-principles-disciple/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.2.0"
        },
        {
          "name": "ora",
          "manifest": "packages/create-principles-disciple/package.json",
          "ecosystem": "npm",
          "version_constraint": "^9.4.0"
        },
        {
          "name": "picocolors",
          "manifest": "packages/create-principles-disciple/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.0.0"
        },
        {
          "name": "semver",
          "manifest": "packages/create-principles-disciple/package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.8.5"
        },
        {
          "name": "tar",
          "manifest": "packages/create-principles-disciple/package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.5.15"
        },
        {
          "name": "@principles/core",
          "manifest": "packages/openclaw-plugin/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.74.1"
        },
        {
          "name": "@sinclair/typebox",
          "manifest": "packages/openclaw-plugin/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.34.48"
        },
        {
          "name": "better-sqlite3",
          "manifest": "packages/openclaw-plugin/package.json",
          "ecosystem": "npm",
          "version_constraint": "^12.9.0"
        },
        {
          "name": "commander",
          "manifest": "packages/openclaw-plugin/package.json",
          "ecosystem": "npm",
          "version_constraint": "^12.0.0"
        },
        {
          "name": "js-yaml",
          "manifest": "packages/openclaw-plugin/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.2.0"
        },
        {
          "name": "micromatch",
          "manifest": "packages/openclaw-plugin/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.0.8"
        },
        {
          "name": "@principles/core",
          "manifest": "packages/pd-cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.74.1"
        },
        {
          "name": "principles-disciple",
          "manifest": "packages/pd-cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.74.1"
        },
        {
          "name": "better-sqlite3",
          "manifest": "packages/pd-cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^12.9.0"
        },
        {
          "name": "commander",
          "manifest": "packages/pd-cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^12.0.0"
        },
        {
          "name": "js-yaml",
          "manifest": "packages/pd-cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.1.1"
        },
        {
          "name": "@fontsource/jetbrains-mono",
          "manifest": "packages/pd-console/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.2.8"
        },
        {
          "name": "@principles/core",
          "manifest": "packages/pd-console/package.json",
          "ecosystem": "npm",
          "version_constraint": "*"
        },
        {
          "name": "@radix-ui/react-alert-dialog",
          "manifest": "packages/pd-console/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.1.15"
        },
        {
          "name": "@radix-ui/react-dialog",
          "manifest": "packages/pd-console/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.1.15"
        },
        {
          "name": "@radix-ui/react-select",
          "manifest": "packages/pd-console/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.2.6"
        },
        {
          "name": "@radix-ui/react-slot",
          "manifest": "packages/pd-console/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.2.4"
        },
        {
          "name": "@radix-ui/react-tooltip",
          "manifest": "packages/pd-console/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.2.11"
        },
        {
          "name": "@tailwindcss/postcss",
          "manifest": "packages/pd-console/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.3.0"
        },
        {
          "name": "@tailwindcss/vite",
          "manifest": "packages/pd-console/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.3.0"
        },
        {
          "name": "autoprefixer",
          "manifest": "packages/pd-console/package.json",
          "ecosystem": "npm",
          "version_constraint": "^10.5.2"
        },
        {
          "name": "better-sqlite3",
          "manifest": "packages/pd-console/package.json",
          "ecosystem": "npm",
          "version_constraint": "^12.9.0"
        },
        {
          "name": "class-variance-authority",
          "manifest": "packages/pd-console/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.7.1"
        },
        {
          "name": "clsx",
          "manifest": "packages/pd-console/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.1.1"
        },
        {
          "name": "i18next",
          "manifest": "packages/pd-console/package.json",
          "ecosystem": "npm",
          "version_constraint": "^26.1.0"
        },
        {
          "name": "js-yaml",
          "manifest": "packages/pd-console/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.2.0"
        },
        {
          "name": "lucide-react",
          "manifest": "packages/pd-console/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.23.0"
        },
        {
          "name": "postcss",
          "manifest": "packages/pd-console/package.json",
          "ecosystem": "npm",
          "version_constraint": "^8.5.14"
        },
        {
          "name": "postcss-cli",
          "manifest": "packages/pd-console/package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.0.1"
        },
        {
          "name": "react",
          "manifest": "packages/pd-console/package.json",
          "ecosystem": "npm",
          "version_constraint": "^19.2.7"
        },
        {
          "name": "react-dom",
          "manifest": "packages/pd-console/package.json",
          "ecosystem": "npm",
          "version_constraint": "^19.2.7"
        },
        {
          "name": "react-i18next",
          "manifest": "packages/pd-console/package.json",
          "ecosystem": "npm",
          "version_constraint": "^17.0.8"
        },
        {
          "name": "react-router-dom",
          "manifest": "packages/pd-console/package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.15.0"
        },
        {
          "name": "semver",
          "manifest": "packages/pd-console/package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.8.5"
        },
        {
          "name": "sonner",
          "manifest": "packages/pd-console/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.0.7"
        },
        {
          "name": "tailwind-merge",
          "manifest": "packages/pd-console/package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.6.0"
        },
        {
          "name": "tailwindcss",
          "manifest": "packages/pd-console/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.3.2"
        },
        {
          "name": "@earendil-works/pi-agent-core",
          "manifest": "packages/principles-core/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.79.4"
        },
        {
          "name": "@earendil-works/pi-ai",
          "manifest": "packages/principles-core/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.80.7"
        },
        {
          "name": "@mariozechner/pi-ai",
          "manifest": "packages/principles-core/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.73.1"
        },
        {
          "name": "@sinclair/typebox",
          "manifest": "packages/principles-core/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.34.48"
        },
        {
          "name": "better-sqlite3",
          "manifest": "packages/principles-core/package.json",
          "ecosystem": "npm",
          "version_constraint": "^12.9.0"
        },
        {
          "name": "js-yaml",
          "manifest": "packages/principles-core/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.1.1"
        },
        {
          "name": "typebox",
          "manifest": "packages/principles-core/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.2.2"
        }
      ],
      "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": 11,
        "merged_prs": 1007,
        "open_issues": 0,
        "closed_ratio": 1,
        "closed_issues": 132,
        "closed_unmerged_prs": 98
      },
      "bus_factor": 1,
      "bot_contributors": 2,
      "top_contributors": [
        {
          "type": "User",
          "login": "csuzngjh",
          "commits": 1197,
          "avatar_url": "https://avatars.githubusercontent.com/u/10056748?v=4"
        },
        {
          "type": "User",
          "login": "claude",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/81847?v=4"
        },
        {
          "type": "User",
          "login": "semantic-release-bot",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/32174276?v=4"
        }
      ],
      "contributors_sampled": 3,
      "top_contributor_share": 0.998
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ai-review.yml",
        "ci.yml",
        "codeql.yml",
        "deploy-website.yml",
        "e2e-nightly.yml",
        "issue-management.yml",
        "pd-console-e2e.yml",
        "pr-checks.yml",
        "publish-npm.yml",
        "regression-e2e.yml",
        "repo-health.yml",
        "stale.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        "eslint.config.js"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": null,
            "reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "28 out of 28 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 4,
            "reason": "Found 9/19 approved changesets -- score normalized to 4",
            "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": 10,
            "reason": "update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 9 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 6,
            "reason": "dependency not pinned by hash detected -- score normalized to 6",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 10,
            "reason": "SAST tool is run on all commits",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 10,
            "reason": "security policy file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "50 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "f7acb0f4a9c98ad4bb5614b13cf02479b4d3639a",
        "ran_at": "2026-07-22T03:07:10Z",
        "aggregate_score": 6.5,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": true,
      "has_security_policy": true,
      "has_dependabot_config": true
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-22T02:52:42Z",
      "oldest_open_prs": [
        {
          "number": 1238,
          "created_at": "2026-07-18T01:55:25Z",
          "last_comment_at": "2026-07-18T01:58:24Z",
          "last_comment_author": "codecov"
        },
        {
          "number": 1239,
          "created_at": "2026-07-20T01:51:50Z",
          "last_comment_at": "2026-07-20T02:14:24Z",
          "last_comment_author": "codecov"
        },
        {
          "number": 1240,
          "created_at": "2026-07-20T09:16:17Z",
          "last_comment_at": "2026-07-20T09:21:13Z",
          "last_comment_author": "codecov"
        },
        {
          "number": 1241,
          "created_at": "2026-07-20T09:16:24Z",
          "last_comment_at": "2026-07-20T09:23:10Z",
          "last_comment_author": "codecov"
        },
        {
          "number": 1242,
          "created_at": "2026-07-20T09:16:28Z",
          "last_comment_at": "2026-07-20T09:22:35Z",
          "last_comment_author": "codecov"
        },
        {
          "number": 1243,
          "created_at": "2026-07-20T09:16:37Z",
          "last_comment_at": "2026-07-20T09:22:19Z",
          "last_comment_author": "codecov"
        },
        {
          "number": 1244,
          "created_at": "2026-07-20T09:16:55Z",
          "last_comment_at": "2026-07-20T09:24:36Z",
          "last_comment_author": "codecov"
        },
        {
          "number": 1245,
          "created_at": "2026-07-20T09:17:08Z",
          "last_comment_at": "2026-07-20T09:23:12Z",
          "last_comment_author": "codecov"
        },
        {
          "number": 1246,
          "created_at": "2026-07-20T09:17:22Z",
          "last_comment_at": "2026-07-20T09:24:31Z",
          "last_comment_author": "codecov"
        },
        {
          "number": 1247,
          "created_at": "2026-07-21T01:55:20Z",
          "last_comment_at": "2026-07-21T01:57:36Z",
          "last_comment_author": "codecov"
        },
        {
          "number": 1248,
          "created_at": "2026-07-22T01:52:28Z",
          "last_comment_at": "2026-07-22T01:55:25Z",
          "last_comment_author": "codecov"
        }
      ],
      "last_merged_pr_at": "2026-07-17T07:46:03Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/csuzngjh/principles",
    "host": "github.com",
    "name": "principles",
    "owner": "csuzngjh"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "good",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 70,
      "inputs": {
        "security": 72,
        "vitality": 87,
        "community": 47,
        "governance": 56,
        "engineering": 86
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 87,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 78,
            "inputs": {
              "commits_last_year": 1712,
              "human_commit_share": 0.81,
              "days_since_last_push": 0,
              "active_weeks_last_year": 20
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "20/52 weeks with commits",
                "points": 13.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 20
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "1712 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 1712
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 9 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "releases_count": 4,
              "latest_release_tag": "v1.75.1",
              "releases_from_tags": false,
              "days_since_latest_release": 18,
              "mean_days_between_releases": 11.1
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "4 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 18 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 18
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~11.1 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 11.1
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 4,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 4 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "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": 47,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 1,
              "stars": 1,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "below_threshold"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "1 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "1 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "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": "good",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 77,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (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": 18,
                "status": "met",
                "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": 6.3,
                "status": "met",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "good",
            "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": 78,
            "inputs": {
              "packages": [
                "@principles/pd-cli",
                "principles-disciple",
                "@principles/core",
                "create-principles-disciple"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 44700
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "44,700 downloads/month across npm",
                "points": 62,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 44700,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 56,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 13,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 3,
              "top_contributor_share": 0.998
            },
            "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": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "3 contributors",
                "points": 4.1,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "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": "excellent",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 88,
            "inputs": {
              "merged_prs": 1007,
              "open_issues": 0,
              "closed_issues": 132,
              "issue_closed_ratio": 1,
              "closed_unmerged_prs": 98
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "100% of issues closed",
                "points": 46.8,
                "status": "met",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "1007/1105 decided PRs merged",
                "points": 34.9,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 1007,
                      "decided": 1105
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 9/19 approved changesets -- score normalized to 4",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 41,
            "inputs": {
              "followers": 9,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "csuzngjh",
              "public_repos": 2,
              "account_age_days": 4248
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "9 followers of csuzngjh",
                "points": 7.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 9,
                      "login": "csuzngjh"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "2 public repos, account ~11 yr old",
                "points": 15.5,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 2
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 11
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "@principles/pd-cli",
                "principles-disciple",
                "@principles/core",
                "create-principles-disciple"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 4
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "4 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 4,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 4 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "232 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 232
                    }
                  }
                ],
                "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": "excellent",
        "name": "Engineering Quality",
        "value": 86,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 84,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "12 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 12
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": "eslint.config.js",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "eslint.config.js"
                    }
                  }
                ],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "28 out of 28 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "topics": [
                "ai-agent",
                "monorepo",
                "openclaw",
                "openclaw-plugin",
                "principles",
                "self-improving",
                "sqlite",
                "typescript",
                "pain-signals",
                "agent-governance",
                "co-evolution",
                "alignment-layer"
              ],
              "has_wiki": false,
              "homepage": "https://principles-website.pages.dev",
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://principles-website.pages.dev",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "12 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 12
                    }
                  }
                ],
                "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": "good",
        "name": "Security",
        "value": 72,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "moderate",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Branch-Protection, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 65,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 6.5
            },
            "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": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "28 out of 28 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 9/19 approved changesets -- score normalized to 4",
                "points": 3,
                "status": "partial",
                "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": "update tool detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 9 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 6",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is run on all commits",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file detected",
                "points": 5,
                "status": "met",
                "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": "50 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "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:@principles/pd-cli@1.133.0 runtime dependency closure — what installing the published package pulls in — 161 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:@principles/pd-cli@1.133.0",
                  "assessed": 161
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 161,
              "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": 161,
              "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": 80,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md",
                "GEMINI.md",
                "packages/create-principles-disciple/templates/langs/en/core/AGENTS.md",
                "packages/create-principles-disciple/templates/langs/zh/core/AGENTS.md",
                "packages/openclaw-plugin/src/core/AGENTS.md",
                "packages/openclaw-plugin/src/hooks/AGENTS.md",
                "packages/openclaw-plugin/templates/langs/en/core/AGENTS.md",
                "packages/openclaw-plugin/templates/langs/zh/core/AGENTS.md",
                "packages/website/video/homepage-demo/AGENTS.md",
                "packages/website/video/homepage-demo/CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 22917
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md, GEMINI.md, packages/create-principles-disciple/templates/langs/en/core/AGENTS.md, packages/create-principles-disciple/templates/langs/zh/core/AGENTS.md, packages/openclaw-plugin/src/core/AGENTS.md, packages/openclaw-plugin/src/hooks/AGENTS.md, packages/openclaw-plugin/templates/langs/en/core/AGENTS.md, packages/openclaw-plugin/templates/langs/zh/core/AGENTS.md, packages/website/video/homepage-demo/AGENTS.md, packages/website/video/homepage-demo/CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.md, GEMINI.md, packages/create-principles-disciple/templates/langs/en/core/AGENTS.md, packages/create-principles-disciple/templates/langs/zh/core/AGENTS.md, packages/openclaw-plugin/src/core/AGENTS.md, packages/openclaw-plugin/src/hooks/AGENTS.md, packages/openclaw-plugin/templates/langs/en/core/AGENTS.md, packages/openclaw-plugin/templates/langs/zh/core/AGENTS.md, packages/website/video/homepage-demo/AGENTS.md, packages/website/video/homepage-demo/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": "81 of 81 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 81,
                      "sampled": 81
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 70,
            "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": [
                "packages/create-principles-disciple/tsconfig.json",
                "packages/openclaw-plugin/tsconfig.json",
                "packages/pd-cli/tsconfig.json",
                "packages/pd-console/tests/e2e/tsconfig.json",
                "packages/pd-console/tsconfig.json",
                "packages/principles-core/tsconfig.json",
                "scripts/nocturnal/tsconfig.json",
                "tests/e2e-fixtures/trap-01-circular-dep/tsconfig.json",
                "tsconfig.json"
              ],
              "agent_commit_share": 0.01,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0.19
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": "eslint.config.js",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "eslint.config.js"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "packages/create-principles-disciple/tsconfig.json, packages/openclaw-plugin/tsconfig.json, packages/pd-cli/tsconfig.json, packages/pd-console/tests/e2e/tsconfig.json, packages/pd-console/tsconfig.json, packages/principles-core/tsconfig.json, scripts/nocturnal/tsconfig.json, tests/e2e-fixtures/trap-01-circular-dep/tsconfig.json, tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "packages/create-principles-disciple/tsconfig.json, packages/openclaw-plugin/tsconfig.json, packages/pd-cli/tsconfig.json, packages/pd-console/tests/e2e/tsconfig.json, packages/pd-console/tsconfig.json, packages/principles-core/tsconfig.json, scripts/nocturnal/tsconfig.json, tests/e2e-fixtures/trap-01-circular-dep/tsconfig.json, tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "1 of the last 100 commits agent-authored or agent-credited",
                "points": 2,
                "status": "partial",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 1,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "19 of the last 100 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 19,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 6",
                "points": 6,
                "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": 200404,
              "source_files_sampled": 1463,
              "oversized_source_files": 16
            },
            "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": "16/1463 source files over 60KB",
                "points": 54.4,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 1463,
                      "oversized": 16
                    }
                  }
                ],
                "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": [
    "Could not fetch npm package '@principles/nocturnal-benchmark' from its registry",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-22T03:07:31.628478Z",
  "schema_version": "0.26.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/c/csuzngjh/principles.svg",
  "full_name": "csuzngjh/principles",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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