Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-23 09:52 UTC

KristjanPikhof / Pi-YAML-Hooks

YAML hook automation for the PI coding agent: tool guards, session hooks, prompts, notifications, and bash actions.

TypeScript · ShellMIT★ 8 estrellas⑂ 2 forksdesde abr 2026Ver en GitHub ↗

KristjanPikhof/Pi-YAML-Hooks tiene un índice de salud de 44 sobre 100, lo que lo sitúa en la banda En riesgo. Su puntuación más alta es AI Readiness (63/100) y la más baja, Security (30/100). Se actualizó por última vez hace 5 días. Una sola persona concentra la mayor parte del trabajo reciente.

44
global / 100
En riesgo

Í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.

44
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

EsmaabiCuenta personal
5 seguidores29 repositorios públicosdesde feb 2020

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

Métricas por categoría

Vitalidad

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

41En riesgo · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 5 días
3.5/36Cadencia de commits — 5/52 semanas con commits
18/18Volumen de commits — 1314 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year1314
human_commit_share1
days_since_last_push5
active_weeks_last_year5
Cómo se puntúa
0/27Publica versiones — sin versiones publicadas
0/36Recencia de las versiones — sin versiones
0/27Cadencia de publicación — sin versiones
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count0
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?

37En riesgo · 18% del índice global
Cómo se puntúa
13.7/60Estrellas — 8 estrellas
0/25Forks — 2 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks2
stars8
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (MIT)
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
Cómo se puntúa
45.3/80Descargas mensuales — 2495 descargas/mes en npm
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packagespi-yaml-hooks
dependents
ecosystemsnpm
total_downloads
monthly_downloads2495
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?

53Moderado · 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
1.4/13.5Amplitud de contribuyentes — 1 contribuyentes
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
38.2/38.3Aceptación de PR — 14/14 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/3 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs14
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Excluidos de la puntuación (sin datos o no aplicable): Resolución de issues. Los pesos restantes se han renormalizado.
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
5.6/25Alcance del propietario — 5 seguidores de KristjanPikhof
22.8/25Trayectoria — 29 repos públicos, cuenta de ~6 años
Datos de entrada utilizados
followers5
owner_typeUser
is_verified
owner_loginKristjanPikhof
public_repos29
account_age_days2362
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 — 1 paquete(s) en npm
35/35Recencia de publicación — última publicación hace 5 días
20/20Historial de versiones — 6 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagespi-yaml-hooks
ecosystemsnpm
any_deprecatedno
min_days_since_publish5

Calidad de Ingeniería

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

54Moderado · 20% del índice global
Cómo se puntúa
0/24Flujos de trabajo de CI
24/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — 0 out of 3 merged PRs checked by a CI test -- score normalized to 0
Datos de entrada utilizados
has_cino
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno

Documentación

100Excelente
Cómo se puntúa
30/30README
25/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — https://npmjs.com/package/pi-yaml-hooks
10/10Descripción del repositorio
10/10Topics — 17 topics
10/10Wiki
Datos de entrada utilizados
topicsagent-hooks, agentic-ai, agents, ai, automation, coding-agent, developer-tools, hooks, pi, pi-coding-agent, pi-package, yaml, pi-extension, pi-extensions, hook, pi-hooks, oh-my-pi
has_wiki
homepagehttps://npmjs.com/package/pi-yaml-hooks
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?

30En riesgo · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — 0 out of 3 merged PRs checked by a CI test -- score normalized to 0
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/3 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
0/10Dangerous-Workflow — sin datos
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — license file detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — sin datos
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — sin datos
0/7.5Token-Permissions — sin datos
5.2/7.5Vulnerabilities — 3 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated14
scorecard_versionv5.5.0
checks_inconclusive4
scorecard_aggregate3
Excluidos de la puntuación (sin datos o no aplicable): dangerous_workflow, packaging, signed_releases, token_permissions. Los pesos restantes se han renormalizado.

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.

63Moderado · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — AGENTS.md, CLAUDE.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 96 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,96
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes7136
Cómo se puntúa
0/18Arranque con un solo comando
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — tsconfig.json
10/10Entorno reproducible — lockfile
0/10Práctica demostrada con agentes — ningún commit con autoría de agente entre los últimos 100
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfilespackage-lock.json
has_dockerfileno
typed_language
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configstsconfig.json
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — TypeScript (tipado estático)
53.4/55Tamaños de archivo manejables — 2/68 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageTypeScript
largest_source_bytes77.455
source_files_sampled68
oversized_source_files2
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
0/20Servidor MCP
40/40Ejemplos ejecutables — examples
Datos de entrada utilizados
example_dirsexamples
has_mcp_signalno
api_schema_files

Datos clave

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

Advertencias de recopilación de datos

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository
  • deps.dev does not index npm:pi-yaml-hooks@2026.7.19; advisories assessed against the repository dependency graph instead

Más detalle

Historial de estrellas y forks 0 ★ / 2 ⇿
0Estrellas
2Forks

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.

111222212026-062026-062026-06
OpenSSF Scorecard 3.0 / 10
3.0agregado

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-23 09:52 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
0CI-Tests0 out of 3 merged PRs checked by a CI test -- score normalized to 0
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/3 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
n/dDangerous-Workflowno workflows found
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
n/dPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
n/dSigned-Releasesno releases found
n/dToken-PermissionsNo tokens found
7Vulnerabilities3 existing vulnerabilities detected
Dependencias directas 1
RegistroPaqueteRestricción de versiónManifiesto
npmyaml^2.9.0package.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

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [
        "agent-hooks",
        "agentic-ai",
        "agents",
        "ai",
        "automation",
        "coding-agent",
        "developer-tools",
        "hooks",
        "pi",
        "pi-coding-agent",
        "pi-package",
        "yaml",
        "pi-extension",
        "pi-extensions",
        "hook",
        "pi-hooks",
        "oh-my-pi"
      ],
      "is_fork": false,
      "size_kb": 1656,
      "has_wiki": true,
      "homepage": "https://npmjs.com/package/pi-yaml-hooks",
      "languages": {
        "Shell": 112396,
        "JavaScript": 2811,
        "TypeScript": 837321
      },
      "pushed_at": "2026-07-17T23:42:27Z",
      "created_at": "2026-04-22T11:05:36Z",
      "owner_type": "User",
      "updated_at": "2026-07-19T07:57:41Z",
      "description": "  YAML hook automation for the PI coding agent: tool guards, session hooks, prompts, notifications, and bash actions.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript",
        "Shell"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Esmaabi",
      "type": "User",
      "login": "KristjanPikhof",
      "company": null,
      "location": null,
      "followers": 5,
      "avatar_url": "https://avatars.githubusercontent.com/u/60576985?v=4",
      "created_at": "2020-02-02T15:50:52Z",
      "is_verified": null,
      "public_repos": 29,
      "account_age_days": 2362
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [],
      "recent_commits": [
        {
          "oid": "36d724f643c23120c791b4f7dec79b46b7b19a49",
          "body": "Remediate adm-zip audit findings and prepare 2026.7.19",
          "is_bot": false,
          "headline": "Merge pull request #14 from KristjanPikhof/fix/npm-audit-vulnerabilities",
          "author_name": "Esmaabi",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T23:42:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d8fe048d2515cd96c585604d89dab7fabd04d605",
          "body": "- Keep the manifest override aligned with the lockfile resolution\n- Require Node 14 or newer for the updated adm-zip release",
          "is_bot": false,
          "headline": "Override adm-zip dependency version",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T23:26:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3788f8d17431ee2b2f164d15812d473ba955d7df",
          "body": "- Advance the package release to version 2026.7.19\n- Normalize the packaged CLI path for consistent npm metadata",
          "is_bot": false,
          "headline": "Bump release version and package bin path",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T23:24:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9cfd553a1f2a4b6adf14c24ef0847e422e8f3b7d",
          "body": "…lity\n\nPrepare Pi 0.80.10 compatibility",
          "is_bot": false,
          "headline": "Merge pull request #13 from KristjanPikhof/chore/pi-0.80.10-compatibi…",
          "author_name": "Esmaabi",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T23:22:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "611ecb5aa9a2b0f9383ac184b10c557e933c49e0",
          "body": null,
          "is_bot": false,
          "headline": "chore: prepare Pi 0.80.10 compatibility",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T22:55:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "59f15c1813c6a91d1d46f2f0157bd6bc38f18517",
          "body": "Add native OMP support to pi-yaml-hooks",
          "is_bot": false,
          "headline": "Merge pull request #12 from KristjanPikhof/feat/add-omp-support",
          "author_name": "Esmaabi",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T21:45:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3bdd86294870cf507654c749fdd695063f38ac63",
          "body": "- Record the completed gate's expanded 24-test runtime result\n- Keep maintenance documentation aligned with current verification\n  evidence",
          "is_bot": false,
          "headline": "Update runtime smoke test count",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:55:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4bc82d49ed84a3e265f396458e6ef0152bdb782e",
          "body": "- Exercise continuation and idle lifecycle ordering explicitly\n- Reject unexpected session deletion during deferred continuation flows",
          "is_bot": false,
          "headline": "Harden session continuation lifecycle checks",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:51:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3781fbd2ed8c6ee27cacf43d083b272f0143329f",
          "body": "- Keep expected smoke-test totals aligned with the expanded checks\n- Ensure the host matrix script validates all 24 test files and passes",
          "is_bot": false,
          "headline": "Update host matrix test totals",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:47:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2b0afba5cabed7204d40d8dbabfcc1b441f0506b",
          "body": "- Resolve project paths canonically before asserting hook locations\n- Keep Pi and OMP trust coverage stable under symlinked sandboxes",
          "is_bot": false,
          "headline": "Fix test paths for symlinked projects",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:42:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1be9100bb8eecab464efa2c28715c404bb4ebcec",
          "body": "- Model session-stop settlement before agent-end assertions\n- Cover one-shot notification suppression and rearming behavior",
          "is_bot": false,
          "headline": "Align agent-end test with session stops",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:39:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e840a1c7dc22423f96ffb08e916eee5191ca49e2",
          "body": "- Verifies confirmation receives the remaining dispatch budget\n- Keeps timeout and cancellation assertions aligned with deadline\n  handling",
          "is_bot": false,
          "headline": "Align confirmation test with dispatch deadline",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:38:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ba60ca6d44acadc1ca0c47872ecd0ddebb71a2c0",
          "body": "- Prevents expired OMP requests from opening confirmation UI\n- Adds regression coverage for exhausted synchronous deadlines",
          "is_bot": false,
          "headline": "Block expired confirmation requests",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:35:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dab25d108c0d31c2d7860a175457d3b4bb6a3354",
          "body": "- Add coverage for sharing one deadline across bash and confirmation\n  actions\n- Preserve fail-closed behavior when the remaining confirmation budget\n  is exhausted",
          "is_bot": false,
          "headline": "Propagate remaining confirmation budgets",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:34:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3d71e4c335cf7108cb156deb919c82e2c6c8ecc7",
          "body": "- Verify failed writes do not report mutations\n- Use resolved filesystem paths for OMP write results\n- Avoid file changes for unresolved internal URIs",
          "is_bot": false,
          "headline": "Test authoritative OMP write paths",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:33:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1fab65c607359f54066d7903fe69e9388da75d45",
          "body": "- Pass the remaining synchronous budget to confirmation prompts\n- Preserve the Pi two-argument confirmation ABI\n- Reject confirmations that outlive the shared OMP deadline",
          "is_bot": false,
          "headline": "Add deadline-aware confirmation handling",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:33:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e3e00307af35684c15800bfe6a1789072079f642",
          "body": "- Preserve authoritative paths for OMP write results\n- Keep failed and empty mutations from falling back to requests",
          "is_bot": false,
          "headline": "Preserve authoritative OMP mutation paths",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:32:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2b88415b258e0bff09c28f7bf0e0c3226aa6f765",
          "body": "- Add regression coverage for OMP-only synchronous bash budgeting\n- Keep PI runtimes without a configured synchronous bash budget",
          "is_bot": false,
          "headline": "Add OMP bash budget regression coverage",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:32:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7c5c1a3c0b05866dd69ea7554daaca3fd0797cc0",
          "body": "- Cover default and explicit bash timeout behavior\n- Verify one synchronous budget spans multiple hook actions",
          "is_bot": false,
          "headline": "Add bash budget regression tests",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:31:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "53c45c2123504fad5893c4eb15ddecd018ae35a0",
          "body": "- Normalize project hook paths through realpath in tests\n- Seed reload tests with the initial discovery snapshot\n- Use discovered watch paths directly during autocomplete reloads\n- Reset import-related environment flags between test sandboxes",
          "is_bot": false,
          "headline": "Fix hook reload path tracking",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:31:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "59742cac6da699519bcb202c5ecd9599ac01cf84",
          "body": "- Enforces bounded OMP confirmation handling for synchronous bash hooks\n- Keeps PI confirmation behavior compatible while failing closed on\n  timeout\n- Applies host-specific runtime budgets without losing initial watch\n  paths",
          "is_bot": false,
          "headline": "Enforce host-specific bash time budgets",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:30:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eaa0efcc86e7dfaf4274f0942c32cdda55d54474",
          "body": "- Keep synchronous bash limits host-specific and explicit\n- Prevent synchronous-only budget data from reaching async hooks\n- Cover autocomplete refresh behavior for added and edited imports",
          "is_bot": false,
          "headline": "Enforce synchronous bash time budgets",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:29:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "561e5d79525cb889ad1ee2eabddf1832e1fb6380",
          "body": "- Verify autocomplete caching and watch-triggered invalidation behavior\n- Preserve test isolation for import-policy environment settings",
          "is_bot": false,
          "headline": "Add autocomplete cache invalidation tests",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:29:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ee3ae84ece1905ce4c6ee4377f4abbda30f51bf7",
          "body": "- Verify directory and missing-file watch paths during discovery\n- Keep regression coverage aligned with runtime reload behavior",
          "is_bot": false,
          "headline": "Harden runtime path watch tests",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:29:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9dc27772c0577cc2f8b18999b37fabe3734e98bc",
          "body": "- Bound synchronous bash hooks by the remaining dispatch budget\n- Record the effective timeout used for hook execution and logging",
          "is_bot": false,
          "headline": "Enforce synchronous bash time budgets",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:28:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "456fa5c7ca7d751f785971e119984650c634b2c3",
          "body": "- Preserve discovered watch paths when initializing and reloading hooks\n- Keep autocomplete invalidation aligned with snapshot watch metadata\n- Cover initial watch-path propagation in runtime regression tests",
          "is_bot": false,
          "headline": "Track hook watch paths across reloads",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:27:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fd94a136d95848ab61bde2974cba49f60d23edae",
          "body": "- Track imported files, directories, and missing candidates for reloads\n- Reuse watch fingerprints to refresh autocomplete without rescanning",
          "is_bot": false,
          "headline": "Track hook paths for autocomplete reloads",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:26:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "197b58e80e1a0a3841df58779945e65298518158",
          "body": "- Verify cancelled session switches defer deletion until success\n- Cover the resulting session.deleted dispatch and reason",
          "is_bot": false,
          "headline": "Add cancelled switch lifecycle coverage",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:26:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "93b81e4e29269cb9c090a61dd04e2e851e3647d9",
          "body": "- Reload hooks when imported files or directories appear\n- Cover newly created directory children and missing imports",
          "is_bot": false,
          "headline": "Track imported hook paths for reloads",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:26:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "89f754496728bd0495aa64661daaf1e91076058b",
          "body": "- Defer session deletion until OMP switches complete successfully\n- Preserve parent and child session behavior across lifecycle\n  transitions\n- Cover duplicate, reload, resume, fork, and handoff cases",
          "is_bot": false,
          "headline": "Fix OMP session lifecycle handling",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:26:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b1c98deb47c6b7672a4fce2b2962e266c51e9ba2",
          "body": "- Extend the fake harness to model parent sessions\n- Cover reload and handoff lifecycle reasons",
          "is_bot": false,
          "headline": "Add parent session lifecycle test support",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:25:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0e5ccb000e6604f89d4b4df4f177a1ec3834cb37",
          "body": "- Verifies packed OMP consumers can import the extension without peer\n  packages\n- Confirms the packed artifact exposes the expected subpath export",
          "is_bot": false,
          "headline": "Add packed OMP import verification",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:25:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "50ab25542717069eddbba2cec259011b4fe591cf",
          "body": "- Preserve root-session routing for late tool results\n- Resolve lineage while the original session manager is active",
          "is_bot": false,
          "headline": "Preserve root session routing",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:25:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "06362538cdb008964b3122dd5f6303548555fc79",
          "body": "- Preserves affected paths when an edit reports applied evidence\n  alongside an error result\n- Covers both diff and before/after snapshot evidence",
          "is_bot": false,
          "headline": "Preserve paths from partial edit results",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:25:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "25720a876cfd719d75c3501d5587b0f8b974fb85",
          "body": "- Prevents reload, resume, fork, and handoff events from being\n  misclassified as new OMP sessions\n- Keeps reasonless startup handling compatible with OMP behavior",
          "is_bot": false,
          "headline": "Fix OMP session lifecycle deduplication",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:25:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1983a96c65613b3a2517e3b5b54f332037e28481",
          "body": "- Preserve grapheme-aware widths when rendering diagnostics\n- Keep wrapped output bounded for oversized segments and newlines\n- Extend coverage for emoji, narrow widths, caching, and invalidation",
          "is_bot": false,
          "headline": "Fix diagnostics wrapping edge cases",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:24:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e56dabd7b5fe0d9b3c0bc50b8b340eecf04f8719",
          "body": "- Arm OMP idle handling on session_stop\n- Dispatch only after the following agent_end settles\n- Suppress continuation and restart races with regression tests",
          "is_bot": false,
          "headline": "Fix OMP idle event sequencing",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:22:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "91d3da20084079f45a548fae31082d3c97a154d5",
          "body": "- Add width-aware diagnostics rendering with ANSI-safe wrapping\n- Cache rendered rows by width and support explicit invalidation\n- Cover bounded output, theme colors, and cache refresh behavior",
          "is_bot": false,
          "headline": "Add width-aware diagnostics rendering",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:22:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ec43aa8155091909bcd0295b8ab96ded67afd7b6",
          "body": "- Treat failed OMP edits as producing no mutation metadata\n- Preserve request metadata while suppressing failed edit paths and\n  triggers\n- Cover single-file and mixed multi-file failure behavior with\n  regression tests",
          "is_bot": false,
          "headline": "Handle failed OMP edit results",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:21:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fbbd2a3f60639e07124ac2f3df697e8dd87ef7a8",
          "body": "- Cover empty mutation metadata for fully failed edits\n- Preserve only successful paths for mixed edit results",
          "is_bot": false,
          "headline": "Add OMP edit mapping regression tests",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:19:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "03a5278bec45743c9f032e96b1479a48d5da8f72",
          "body": "- Normalize sandbox paths before filesystem assertions\n- Keep temporary test paths stable across symlinked environments",
          "is_bot": false,
          "headline": "Fix sandbox path normalization",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:19:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "44bf38448899c368e43463c6f232911d051010ca",
          "body": "- Dispatch OMP session idle only after session_stop settles\n- Yield before dispatch so continuations can invalidate stale stops\n- Document the host-specific lifecycle behavior",
          "is_bot": false,
          "headline": "Defer OMP idle dispatch safely",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:19:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "12638a4cf247da88c6f6a28e5348609d36e58045",
          "body": "- Treat OMP per-file edit results as authoritative disk mutations\n- Prevent requested paths from leaking into normalized arguments",
          "is_bot": false,
          "headline": "Normalize authoritative OMP edit results",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:19:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "29526aa283355594c931351c9d297def9dd9b3b9",
          "body": "- Cover retry agent_end suppression and genuine session_stop idle\n  dispatch\n- Make the lifecycle test match OMP event semantics",
          "is_bot": false,
          "headline": "Test OMP idle lifecycle handling",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:19:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fd8ee6be2425e8843de53015b6585d089dbd3a68",
          "body": "- Assert project hook resolution after the project branch check\n- Keep watch-path construction aligned with narrowed resolution state",
          "is_bot": false,
          "headline": "Assert project hook resolution",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:19:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "21898cb55284b5e3ae2486ca891a612f821f8332",
          "body": "- Preserve hook events when every source file remains authorized\n- Avoid rebuilding unchanged event hook collections",
          "is_bot": false,
          "headline": "Fix hook retention filtering",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:19:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f01d90e7fd118f766af14a4848636a536eb8e8c6",
          "body": "- Keep hook discovery and watch paths within the canonical trusted repo\n- Cover symlinked working-directory traversal at the config boundary",
          "is_bot": false,
          "headline": "Fix canonical hook path traversal",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:18:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "795890494cfa77d93b1b44a1f7c5e5b4be72b1ac",
          "body": "- Retain only hooks from still-authorized sources after reload errors\n- Cover trust revocation without losing valid global hooks",
          "is_bot": false,
          "headline": "Fix hook retention after trust revocation",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:17:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3dcabed7304e6c306aca7e0dbde27466ff8fe31b",
          "body": "- Stage clean checkout copies before native package installation\n- Verify packaging leaves checkout manifests and dist unchanged\n- Cover forced cleanup termination and updated OMP evidence",
          "is_bot": false,
          "headline": "Harden runtime package smoke checks",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:13:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "90907c655650cdf3d1f92e893fc76cb5bcd24672",
          "body": "- Explains upward project discovery across all supported docs\n- Clarifies that nearer legacy files can beat parent native files",
          "is_bot": false,
          "headline": "Document OMP project discovery order",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:06:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eb2613b1fc13f8d0576136621ca71f4445052d10",
          "body": "- Keeps the assertion aligned with the product's host name casing",
          "is_bot": false,
          "headline": "Fix Pi session wording assertion",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:06:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "20bd6df71e320a920584249b0e05824c46943753",
          "body": "- Verify OMP project fallbacks use native global configuration\n- Ensure Pi global fallback paths stay out of diagnostics and\n  suggestions",
          "is_bot": false,
          "headline": "Clarify OMP fallback config behavior",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:04:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ced8d7c0977b1239d492128b813864dc68549a9e",
          "body": "- Aligns README behavior tables with shared Pi and OMP support\n- Makes prompt guidance and coverage explicit about host-local tool\n  actions",
          "is_bot": false,
          "headline": "Clarify shared Pi and OMP behavior",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:03:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c0eecdbdd43873e11e26c0b166f7dc58492b17a7",
          "body": "- Keep OMP global discovery within the active profile\n- Align documentation and tests with host-aware config behavior",
          "is_bot": false,
          "headline": "Restrict OMP config discovery scope",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:02:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "62bb914d49fab77b3fe44bb8015282e24cacb40d",
          "body": "- Keep OMP global discovery within the active profile agent directory\n- Clarify native project precedence and trust-gated legacy fallback\n- Align user-facing configuration guidance with runtime behavior",
          "is_bot": false,
          "headline": "Restrict OMP config discovery scope",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T02:00:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6b3cb9da57c377446de13d6b6558f7ead98ed2ca",
          "body": "- Keep OMP global discovery scoped to its native agent paths\n- Prevent unintended fallback to legacy Pi global configuration\n- Update coverage for active and named OMP agents",
          "is_bot": false,
          "headline": "Restrict OMP global config fallbacks",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T01:59:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d966968201059bec1f0fc5d726a92601d820fa9a",
          "body": "- Preserve legacy tool inputs while validating authoritative file\n  details\n- Cover successful create and rename results without failed entries",
          "is_bot": false,
          "headline": "Consolidate Pi tool mapping tests",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T01:58:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b94e54c5c9f408c13c6e7b886ee06d8f6dca5b53",
          "body": "- Exercise agent_end-driven idle evaluation after continuations\n- Remove obsolete fake macrotask scheduling test scaffolding",
          "is_bot": false,
          "headline": "Test OMP agent-end idle dispatch",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T01:58:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b16feed0ad5dbd64d5a9434dc07ce9f4ba97a95d",
          "body": "- Wait for a newly emitted idle event instead of stale state\n- Pass the event log explicitly to each RPC driver session",
          "is_bot": false,
          "headline": "Harden Pi smoke idle evidence",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T01:58:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "14a71d807240841f072e06147fb24bc245fe4348",
          "body": "- Align smoke evidence with the actual deferred lifecycle order\n- Keep the runtime assertion focused on event sequencing",
          "is_bot": false,
          "headline": "Fix OMP lifecycle ordering check",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T01:58:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "42c1e7b6e7e82ee0f99f4cb59bb50e2b5113a582",
          "body": "- Document `/hooks-tail-log --follow` and explicit log overrides\n- Clarify post-stop OMP idle dispatch and lifecycle suppression\n- Keep setup, reference, maintenance, and debugging guidance aligned",
          "is_bot": false,
          "headline": "Document updated hook runtime behavior",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T01:40:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "425a25b2393d6077610e4311643ff743a9d01ba0",
          "body": "- Verifies preloaded imports remain watched after runtime startup\n- Covers rapid same-size rewrites that must trigger hook reloads",
          "is_bot": false,
          "headline": "Add test for preloaded hook rewrites",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T01:40:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8fe71d8578efbe7f5217d81a559695db40c491e2",
          "body": "- Preserve initially loaded hook files during runtime creation\n- Pass discovered file snapshots into registry-created runtimes",
          "is_bot": false,
          "headline": "Preserve initial hook file snapshots",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T01:39:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1e75206e418f9a436975292f7c4d8dfc471caebe",
          "body": "- Detect rapid rewrites and metadata changes reliably\n- Keep runtime refresh behavior aligned with trust caching\n- Avoid watcher-dependent writes in regression coverage",
          "is_bot": false,
          "headline": "Harden file change detection",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T01:37:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0c516a471ab1938c04ccd7310597a4f709bc994e",
          "body": "- Keep logger override and fallback coverage with the profile-aware\n  logger tests\n- Remove the duplicated legacy core logger test file",
          "is_bot": false,
          "headline": "Consolidate profile-aware logger tests",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T01:35:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "309addb8f421af143810b336302438638b3dc6cd",
          "body": "- Verify OMP edit results emit file.changed notifications for affected\n  paths",
          "is_bot": false,
          "headline": "Add OMP edit path notification coverage",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T01:35:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cfbdf73396709c7677b811e416cb05a1ac89c6e2",
          "body": "- Preserve the configured override for reliable tmux lookup\n- Keep error reporting tied to the original override value",
          "is_bot": false,
          "headline": "Fix tmux override resolution",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T01:35:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4667411f5db52d6516e816e2990bb21ee6c1db6e",
          "body": "- Terminate spawned process groups when checks time out\n- Preserve cleanup for interrupt signals and graceful shutdown",
          "is_bot": false,
          "headline": "Fix timeout signal propagation",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T01:35:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "576cffc6b296211213b0383be77b8f8339acb61a",
          "body": "- Verify watch candidates across host, project, and worktree scopes\n- Keep the coverage with the consolidated config-path test suite",
          "is_bot": false,
          "headline": "Consolidate hook watch path coverage",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T01:35:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1aa482c5df91f5dc8a83f81e0df96f28a31db372",
          "body": "- Exercise session shutdown alongside session stop\n- Assert the final idle event is dispatched exactly once",
          "is_bot": false,
          "headline": "Tighten OMP idle lifecycle checks",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T01:35:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b1f0829613252897deff2008696be1cc8336869c",
          "body": "- Cover OMP edit payload parsing and authoritative result paths\n- Preserve legacy edit behavior while adding multi-file coverage",
          "is_bot": false,
          "headline": "Add OMP edit path mapping coverage",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T01:35:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "41d510df8f21b9b51b70db1f1bf5dd25802da383",
          "body": "- Preserve the initial loaded-file snapshot for startup watches\n- Use the latest discovered files only when rebuilding watch paths",
          "is_bot": false,
          "headline": "Fix runtime watch path snapshots",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T01:34:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "36e73395b945a4bfc70609321c87fc371b61d729",
          "body": "- Bound OMP smoke tests with configurable outer and grace periods\n- Keep isolated package checks aligned with the copied install root\n- Fail predictably by escalating from SIGTERM to SIGKILL",
          "is_bot": false,
          "headline": "Add timeouts to OMP smoke checks",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T01:34:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3b092a85e3ef18cf7bbbe2fdf7cb149b78dafe08",
          "body": "- Align OMP idle dispatch with settled agent_end semantics\n- Cover continuation suppression after session_stop handlers settle",
          "is_bot": false,
          "headline": "Update OMP idle lifecycle handling",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T01:34:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e91ab8bd9d18e33c3d6d6f3a0c320a9728e108de",
          "body": "- Reuse the configured profile object to derive its agent path\n- Keep the empty override fallback test focused on the active profile",
          "is_bot": false,
          "headline": "Refine logger fallback test setup",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T01:33:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7c5f6ad13939895d6cab0c0ab247236a9b1aa9d4",
          "body": "- Strengthens event-log validation with structured NDJSON checks\n- Verifies event correlation, tool payloads, and session lifecycles",
          "is_bot": false,
          "headline": "Harden smoke test event validation",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T01:33:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f5292d7e672f930a9a0e01209400d96c748861bd",
          "body": "- Ensure tail-follow tests observe filesystem changes during execution",
          "is_bot": false,
          "headline": "Add filesystem watching to tail tests",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T01:33:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b12a0acf0e8638687eaf00ed05d33e9fa9f81ca6",
          "body": "- Preserve authoritative OMP edit paths and operations in change events\n- Parse unified edit inputs when result details are unavailable",
          "is_bot": false,
          "headline": "Support OMP edit change mapping",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T01:33:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "189b7e8928b4a0a385ddcb227b8259122d167ab0",
          "body": "- Verify cached hook discovery reloads every watched source\n- Deduplicate watch paths when project discovery is unavailable\n- Preserve loaded-file tracking for runtime watch invalidation",
          "is_bot": false,
          "headline": "Harden runtime config reload tracking",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T01:32:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6de7fd96266e787360f5f252f59cbe76173d015c",
          "body": "- Validate OMP prompt, lifecycle, and host-policy behavior\n- Cover profile-aware log paths and array-shaped prompt data\n- Strengthen smoke evidence for ordered deferred events",
          "is_bot": false,
          "headline": "Harden OMP host compatibility coverage",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T01:31:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4e8438ddb9fa599b62d841ef97030cbfeb38d9a7",
          "body": "- Make the smoke harness portable across tmux installations\n- Improve package version loading and RPC shutdown diagnostics",
          "is_bot": false,
          "headline": "Harden OMP smoke harness portability",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T01:31:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d0ac102a5a2857a517f4971f26f45eec1b6b7f6f",
          "body": "- Extend OMP adapter coverage for active policy and path validation\n- Reset hook policy between cases to keep tests isolated",
          "is_bot": false,
          "headline": "Expand OMP adapter validation",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T01:31:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "73508fa36e66d328f8dca3b17573ccb01cf897b1",
          "body": "- Register hooks through the API matching the detected host\n- Keep Pi and OMP event wiring explicit and type-safe",
          "is_bot": false,
          "headline": "Clarify host-specific prompt registration",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T01:31:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "146ca18cbe71f91b0750ad08257d966621fa89f3",
          "body": "- Verify PI policy behavior for built-in and unknown tools\n- Preserve diagnostics for unsupported command, runIn, and tool actions",
          "is_bot": false,
          "headline": "Expand PI unsupported hook coverage",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T01:30:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d675b4bce5034a067eb872699507306dc9b04de6",
          "body": "- Register host-specific prompt handlers directly in the shared entry\n  point\n- Remove redundant registration wrappers and normalize formatting",
          "is_bot": false,
          "headline": "Simplify prompt support registration",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T01:30:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "83a42a51aff6a7c3210ad5e2823d3ef5539e4b04",
          "body": "- Covers logger path resolution, overrides, and NDJSON output\n- Adds defensive validation for parsed log entry kinds",
          "is_bot": false,
          "headline": "Add logger regression coverage",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T01:30:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "46fa57a2054770d31f713bd804829df1ec08f616",
          "body": "- Remove an unintended trailing blank line from the host profile module\n- Keep the file ending consistent with the surrounding source style",
          "is_bot": false,
          "headline": "Remove trailing blank line",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T01:29:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "82cab383e85dd04e6948a80eae719e569599dbe3",
          "body": "- Avoid rediscovering hook configuration on unchanged runtime events\n- Cover host, project, trust, and repository watch candidates",
          "is_bot": false,
          "headline": "Add hook configuration watch paths",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T01:29:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c519857b84b07de199611afd512f89c28c686889",
          "body": "- Expose stable discovery paths for change detection\n- Include global, trust, project, and git-related inputs",
          "is_bot": false,
          "headline": "Add hook discovery watch paths",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T01:29:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4a44981aa07225a3f35996a7e7cf128e925e161c",
          "body": "- Keep unsupported-tool warnings accurate for PI and OMP hosts\n- Preserve host prompt blocks while appending OMP awareness\n- Activate OMP-specific hook diagnostics during extension setup",
          "is_bot": false,
          "headline": "Add OMP-aware host diagnostics",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T01:29:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1750e664771ad17c182789a4c2a8d4af42a54e31",
          "body": "- Centralize host-aware logger settings in one configuration object\n- Normalize log-level resolution and trim explicit file overrides",
          "is_bot": false,
          "headline": "Refactor logger configuration resolution",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T01:28:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cb72b08710b755174d5e032de0aa7c64c9893d83",
          "body": "- Pass the resolved log path to tail-hook tooling\n- Support Pi and OMP prompt event type differences\n- Recreate the logger when host configuration changes",
          "is_bot": false,
          "headline": "Add OMP host compatibility",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T01:28:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "50b2bd5ba29373364b3f4124047bb08a2c3bc93d",
          "body": "- Return a cancelled diagnostic result when the session ID is missing\n- Log the interception failure at error level for operator visibility\n- Update regression coverage to require fail-closed behavior",
          "is_bot": false,
          "headline": "Fail closed on missing bash sessions",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T01:26:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "283923a92a4f2221eae5621450ad8fd311188bb3",
          "body": null,
          "is_bot": false,
          "headline": "Document and verify dual-host support",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-17T01:00:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6a7aa4b1eddab7e0adaf82f11ba4af8eb0a155c7",
          "body": "- Make deferred-idle checks work with local pi-tui dependencies\n- Stabilize interactive hook status validation with explicit input\n  timing",
          "is_bot": false,
          "headline": "Harden OMP smoke harness validation",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-16T23:39:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8c355fbfb155903ef5ed0c190b580bc0a3160d7d",
          "body": "- Keep smoke checks resilient to non-JSON transcript output\n- Exercise the installed adapter build used by runtime validation",
          "is_bot": false,
          "headline": "Harden OMP smoke validation",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-16T23:37:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ca5080f012a88babb716f30a47768a7c3e103f69",
          "body": "- Distinguish expected forced termination from crashes\n- Fail only on unexpected shutdown status",
          "is_bot": false,
          "headline": "Harden Pi TUI shutdown checks",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-16T23:35:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8d2f06d170647273b4ecf2fc2c3e41012d83c760",
          "body": "- Preserve combined RPC output for reliable smoke assertions\n- Ensure cleanup removes temporary smoke artifacts consistently",
          "is_bot": false,
          "headline": "Harden OMP smoke harness cleanup",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-16T23:35:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "864da45dc94e9fc2519a75a54ff35f578e541980",
          "body": "- Make the TUI smoke flow wait for its marker before exit\n- Exercise Ctrl-C and Ctrl-D to close an empty editor reliably",
          "is_bot": false,
          "headline": "Harden Pi TUI shutdown validation",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-16T23:32:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4b9c975b523bd8f96ad0b81e1b2d9ed643ee5616",
          "body": "- Normalize temporary paths and captured evidence consistently across\n  platforms",
          "is_bot": false,
          "headline": "Normalize OMP smoke test paths",
          "author_name": "KristjanPikhof",
          "author_login": "KristjanPikhof",
          "committed_at": "2026-07-16T23:32:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 0,
      "commits_last_year": 1314,
      "latest_release_at": null,
      "latest_release_tag": null,
      "releases_from_tags": false,
      "days_since_last_push": 5,
      "active_weeks_last_year": 5,
      "days_since_latest_release": null,
      "mean_days_between_releases": null
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "pi-yaml-hooks",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "hooks",
            "yaml",
            "hook",
            "automation",
            "ai",
            "pi",
            "omp",
            "oh-my-pi",
            "omp-extension",
            "developer-tools",
            "agents",
            "agentic-ai",
            "coding-agent",
            "agent-hooks",
            "pi-coding-agent",
            "pi-extension",
            "pi-package",
            "pi-extensions",
            "pi-hooks",
            "pi-yaml-hooks"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/pi-yaml-hooks",
          "is_deprecated": false,
          "latest_version": "2026.7.19",
          "repository_url": "https://github.com/KristjanPikhof/pi-yaml-hooks",
          "versions_count": 6,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 2495,
          "first_published_at": "2026-05-08T13:19:12.627000Z",
          "latest_published_at": "2026-07-18T00:03:20.952000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        }
      ]
    },
    "popularity": {
      "forks": 2,
      "stars": 8,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2026-06-06",
            "count": 1
          },
          {
            "date": "2026-06-21",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 2,
        "total_forks": 2
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 77455,
      "source_files_sampled": 68,
      "oversized_source_files": 2,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 7136
    },
    "dependencies": {
      "manifests": [
        "package.json"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "yaml",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.9.0"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 14,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "KristjanPikhof",
          "commits": 1314,
          "avatar_url": "https://avatars.githubusercontent.com/u/60576985?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": false,
      "has_tests": true,
      "ci_workflows": [],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 0,
            "reason": "0 out of 3 merged PRs checked by a CI test -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/3 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": null,
            "reason": "no workflows found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 0 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": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": null,
            "reason": "No tokens found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 7,
            "reason": "3 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "36d724f643c23120c791b4f7dec79b46b7b19a49",
        "ran_at": "2026-07-23T09:52:45Z",
        "aggregate_score": 3,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-17T23:42:25Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-17T23:42:23Z",
      "ci_last_conclusion": null,
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/KristjanPikhof/Pi-YAML-Hooks",
    "host": "github.com",
    "name": "Pi-YAML-Hooks",
    "owner": "KristjanPikhof"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "at_risk",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 44,
      "inputs": {
        "security": 30,
        "vitality": 41,
        "community": 37,
        "governance": 53,
        "engineering": 54
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "at_risk",
        "name": "Vitality",
        "value": 41,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "commits_last_year": 1314,
              "human_commit_share": 1,
              "days_since_last_push": 5,
              "active_weeks_last_year": 5
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "5/52 weeks with commits",
                "points": 3.5,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "1314 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 1314
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "critical",
            "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": 1,
            "inputs": {
              "releases_count": 0
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "no releases published",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_releases_published",
                    "params": {}
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "no releases",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_releases",
                    "params": {}
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "no releases",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_releases",
                    "params": {}
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 37,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 14,
            "inputs": {
              "forks": 2,
              "stars": 8,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "8 stars",
                "points": 13.7,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 8
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "2 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 57,
            "inputs": {
              "packages": [
                "pi-yaml-hooks"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 2495
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "2,495 downloads/month across npm",
                "points": 45.3,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 2495,
                      "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": 53,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 10,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 72,
            "inputs": {
              "merged_prs": 14,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "14/14 decided PRs merged",
                "points": 38.2,
                "status": "met",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 14,
                      "decided": 14
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/3 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "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": 48,
            "inputs": {
              "followers": 5,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "KristjanPikhof",
              "public_repos": 29,
              "account_age_days": 2362
            },
            "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": "5 followers of KristjanPikhof",
                "points": 5.6,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 5,
                      "login": "KristjanPikhof"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "29 public repos, account ~6 yr old",
                "points": 22.8,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 29
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 6
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "pi-yaml-hooks"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 5
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 5 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "6 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 6
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "moderate",
        "name": "Engineering Quality",
        "value": 54,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "critical",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 24,
            "inputs": {
              "has_ci": false,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "0 out of 3 merged PRs checked by a CI test -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "topics": [
                "agent-hooks",
                "agentic-ai",
                "agents",
                "ai",
                "automation",
                "coding-agent",
                "developer-tools",
                "hooks",
                "pi",
                "pi-coding-agent",
                "pi-package",
                "yaml",
                "pi-extension",
                "pi-extensions",
                "hook",
                "pi-hooks",
                "oh-my-pi"
              ],
              "has_wiki": true,
              "homepage": "https://npmjs.com/package/pi-yaml-hooks",
              "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://npmjs.com/package/pi-yaml-hooks",
                "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": "17 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 17
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 30,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Dangerous-Workflow, Packaging, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "dangerous_workflow",
                    "packaging",
                    "signed_releases",
                    "token_permissions"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 30,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 14,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 4,
              "scorecard_aggregate": 3
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "0 out of 3 merged PRs checked by a CI test -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/3 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no workflows found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 0 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 not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "No tokens found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "3 existing vulnerabilities detected",
                "points": 5.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 63,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.96,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 7136
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, 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": "96 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 96,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "at_risk",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 43,
            "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": false,
              "typecheck_configs": [
                "tsconfig.json"
              ],
              "agent_commit_share": 0,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 98,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 77455,
              "source_files_sampled": 68,
              "oversized_source_files": 2
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "TypeScript (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "TypeScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "2/68 source files over 60KB",
                "points": 53.4,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 68,
                      "oversized": 2
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index npm:pi-yaml-hooks@2026.7.19; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-23T09:52:59.539074Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/k/KristjanPikhof/Pi-YAML-Hooks.svg",
  "full_name": "KristjanPikhof/Pi-YAML-Hooks",
  "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.27.0 — metodología completa · wiki de métricas.

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