Registro público
Informe de salud del softwareesquema 0.26.0 · métricas 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 estrella⑂ 1 forkdesde ene 2026Ver en GitHub ↗

csuzngjh/principles tiene un índice de salud de 70 sobre 100, lo que lo sitúa en la banda Bueno. Su puntuación más alta es Vitality (87/100) y la más baja, Community & Adoption (47/100). Se actualizó por última vez hoy. Una sola persona concentra la mayor parte del trabajo reciente.

70
global / 100
Bueno

Índice de salud del software

Las métricas se agrupan en categorías ponderadas sobre una escala de 1 a 100. El resultado global parte de su media; cuando la evidencia pública activa la Política de Jurisdicciones de Alto Riesgo, la calificación se ajusta y recibe el límite 49 (En riesgo). Preparación para IA queda fuera.

70
Excelente85-100Ejemplar; cumple prácticamente todos los criterios evaluados
Bueno70-84Saludable; carencias menores
Moderado50-69Aceptable con carencias notables; se recomienda revisión
En riesgo30-49Debilidades significativas; su adopción exige cautela
Crítico1-29Problemas graves (proyecto abandonado, un solo mantenedor, sin higiene)
VitalidadComunidad yAdopciónSostenibilidady GobernanzaCalidad deIngenieríaSeguridadPreparaciónpara IA

Perfil de puntuación

Cada eje es una categoría. La forma importa más que la media: un proyecto sano llena toda la figura, mientras que un perfil de picos y cráteres indica que la fortaleza en una dimensión enmascara el riesgo en otra.

Titularidad

PDCuenta personal
9 seguidores2 repositorios públicosdesde dic 2014

Este repositorio pertenece a una cuenta personal. Un proyecto con un único propietario conlleva más riesgo de continuidad que uno respaldado por una organización.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicaciónEtiquetas
npm@principles/pd-cli1.133.0362870hace 24 días
npmprinciples-disciple1.197.1317.697232hace 4 días
npm@principles/core1.240.1019.853197hace 4 días
npmcreate-principles-disciple1.104.0352234hace 18 díasopenclawprinciples-disciplecliinstallerinteractive

Métricas por categoría

Vitalidad

¿Está vivo el proyecto: se escribe código y se publican versiones?

87Excelente · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
13.8/36Cadencia de commits — 20/52 semanas con commits
18/18Volumen de commits — 1712 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 9 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year1712
human_commit_share0,81
days_since_last_push0
active_weeks_last_year20
Cómo se puntúa
27/27Publica versiones — 4 versiones publicadas
36/36Recencia de las versiones — última versión hace 18 días
27/27Cadencia de publicación — una versión cada ~11,1 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count4
latest_release_tagv1.75.1
releases_from_tagsno
days_since_latest_release18
mean_days_between_releases11,1
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

¿Tiene el proyecto usuarios, descargas, atención y unas condiciones acogedoras para quienes contribuyen?

47En riesgo · 18% del índice global
Cómo se puntúa
0/60Estrellas — 1 estrellas
0/25Forks — 1 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks1
stars1
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonbelow_threshold
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (MIT)
18/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
6.3/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributing
has_issue_templateno
has_code_of_conductno
has_pull_request_template
Cómo se puntúa
62/80Descargas mensuales — 44.700 descargas/mes en npm
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packages@principles/pd-cli, principles-disciple, @principles/core, create-principles-disciple
dependents
ecosystemsnpm
total_downloads
monthly_downloads44.700
Excluidos de la puntuación (sin datos o no aplicable): Dependientes en el registro. Los pesos restantes se han renormalizado.

Sostenibilidad y Gobernanza

¿Sobrevivirá el proyecto a sus personas: factor bus, capacidad de respuesta, quién lo respalda y mantenimiento del paquete?

56Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0/22.5Distribución de commits — el principal contribuyente firma el 100% de los commits
4.1/13.5Amplitud de contribuyentes — 3 contribuyentes
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Datos de entrada utilizados
bus_factor1
contributors_sampled3
top_contributor_share0,998
Cómo se puntúa
46.8/46.8Resolución de issues — 100% de issues cerradas
34.9/38.3Aceptación de PR — 1007/1105 PR decididos fusionados
6/15OpenSSF Scorecard: Code-Review — Found 9/19 approved changesets -- score normalized to 4
Datos de entrada utilizados
merged_prs1007
open_issues0
closed_issues132
issue_closed_ratio1
closed_unmerged_prs98
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
7.2/25Alcance del propietario — 9 seguidores de csuzngjh
15.5/25Trayectoria — 2 repos públicos, cuenta de ~11 años
Datos de entrada utilizados
followers9
owner_typeUser
is_verified
owner_logincsuzngjh
public_repos2
account_age_days4248
Excluidos de la puntuación (sin datos o no aplicable): Dominio verificado. Los pesos restantes se han renormalizado.
Cómo se puntúa
25/25Publicado y resoluble — 4 paquete(s) en npm
35/35Recencia de publicación — última publicación hace 4 días
20/20Historial de versiones — 232 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packages@principles/pd-cli, principles-disciple, @principles/core, create-principles-disciple
ecosystemsnpm
any_deprecatedno
min_days_since_publish4

Calidad de Ingeniería

¿Existen unas prácticas mínimas de ingeniería y documentación?

86Excelente · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 12 flujo(s) de trabajo
24/24Pruebas presentes
16/16Configuración de linter — eslint.config.js
0/9.6Hooks de pre-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
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_config
has_precommit_configno

Documentación

90Excelente
Cómo se puntúa
30/30README
25/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — https://principles-website.pages.dev
10/10Descripción del repositorio
10/10Topics — 12 topics
0/10Wiki
Datos de entrada utilizados
topicsai-agent, monorepo, openclaw, openclaw-plugin, principles, self-improving, sqlite, typescript, pain-signals, agent-governance, co-evolution, alignment-layer
has_wikino
homepagehttps://principles-website.pages.dev
has_readme
has_docs_dir
has_description

Seguridad

¿Son sólidas las prácticas visibles de seguridad y de cadena de suministro, sin exposición jurisdiccional de alto riesgo sin resolver?

72Bueno · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — sin datos
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.5Licencia — 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 — sin datos
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 50 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate6,5
Excluidos de la puntuación (sin datos o no aplicable): branch_protection, signed_releases. Los pesos restantes se han renormalizado.
Cómo se puntúa
35/35Dependencias directas libres de avisos conocidos — ninguna dependencia directa tiene un aviso conocido
25/25Dependencias indirectas libres de avisos conocidos — ninguna dependencia indirecta tiene un aviso conocido
0/40Sin avisos pendientes — ningún aviso tiene fecha de publicación
Datos de entrada utilizados
sourceosv
advisories0
affected_packages0
assessed_packages161
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Excluidos de la puntuación (sin datos o no aplicable): Sin avisos pendientes. Los pesos restantes se han renormalizado. Se cotejó el cierre de dependencias en tiempo de ejecución de npm:@principles/pd-cli@1.133.0 —lo que arrastra la instalación del paquete publicado—: 161 paquetes. No se analiza la alcanzabilidad.

Preparación para IA

¿Hasta qué punto está el repositorio preparado para desarrollarse y mantenerse con agentes de codificación de IA? Es una insignia independiente y experimental — peso 0,0, de modo que se presenta por separado y no afecta a la puntuación de salud global.

80Bueno · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — 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/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 81 de 81 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
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
Cómo se puntúa
0/18Arranque con un solo comando
22/22Pruebas automatizadas
11/11Configuración de lint / formato — eslint.config.js
11/11Verificación estática de tipos — 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/10Entorno reproducible — lockfile
2/10Práctica demostrada con agentes — 1 de los últimos 100 commits con autoría o crédito de agente
8/8Mantenimiento automatizado — 19 de los últimos 100 commits son actualizaciones automáticas de dependencias
6/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 6
Datos de entrada utilizados
has_nixno
has_tests
lockfilespackage-lock.json
has_dockerfileno
typed_language
bootstrap_files
has_devcontainerno
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
Cómo se puntúa
45/45Código verificable por tipos — TypeScript (tipado estático)
54.4/55Tamaños de archivo manejables — 16/1463 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageTypeScript
largest_source_bytes200.404
source_files_sampled1463
oversized_source_files16

Datos clave

1estrellas de GitHub
3contribuidores
1712commits en los últimos 12 meses
0días desde el último push
4versiones publicadas
1factor bus
0issues abiertas
npmecosistemas de paquetes

Advertencias de recopilación de datos

  • 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

Más detalle

Historial de estrellas y forks 1 ★ / 1 ⇿
1Estrellas
1Forks
3Versiones

Cuándo se añadió cada estrella y fork, recopilado de GitHub y agrupado por día. El crecimiento acumulado se sitúa justo encima de las adiciones diarias que lo componen, de modo que ambos se leen en conjunto: la acumulación orgánica sostenida no se parece en nada a un pico abrupto y efímero. Cuando esa diferencia es medible, se informa como autenticidad del crecimiento.

0001111112026-052026-062026-06
Mayor 0Menor 2Parche 1
OpenSSF Scorecard 6.5 / 10
6.5agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).Scorecard v5.5.0 · 2026-07-22 03:07 UTC

10Binary-Artifactsno binaries found in the repo
n/dBranch-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
n/dSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities50 existing vulnerabilities detected
Dependencias directas 53
RegistroPaqueteRestricción de versiónManifiesto
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
Todas las dependencias no recopilado

No fue posible recopilar el conjunto de dependencias resuelto para este informe: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Avisos de dependencias 0

Instalar npm:@principles/pd-cli@1.133.0 arrastra 161 paquetes, directos y transitivos: 0 tienen avisos conocidos, de los cuales 0 son dependencias directas.

Ningún aviso conocido afecta a las dependencias evaluadas.

Un aviso significa que la versión registrada en el grafo de dependencias cae dentro del rango afectado de un aviso. No se analiza la alcanzabilidad, y el grafo incluye fijaciones de desarrollo y prueba: un hallazgo puede referirse al utillaje y no al software distribuido.

Informe JSON sin procesar legible por máquina
{
  "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"
}

Las puntuaciones son señales, no garantías. Reflejan prácticas públicamente visibles en GitHub; no son una auditoría de código ni una garantía de seguridad.

Los datos ausentes se excluyen y los pesos se renormalizan; nunca se puntúan como cero. La metodología es versionada y abierta: métricas v1.13.0, esquema v0.26.0 — metodología completa · wiki de métricas.

Cómo se sitúa un resultado dentro del registro general: estadísticas agregadasnpm.