Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 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 Sterne⑂ 2 Forksseit Apr. 2026Auf GitHub ansehen ↗

KristjanPikhof/Pi-YAML-Hooks erreicht einen Gesundheitsindex von 44 von 100 und liegt damit im Bereich Gefährdet. Am stärksten schneidet es bei AI Readiness (63/100) ab, am schwächsten bei Security (30/100). Zuletzt vor 5 Tagen aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

44
gesamt / 100
Gefährdet

Software-Gesundheitsindex

Metriken werden auf einer Skala von 1–100 in gewichtete Kategorien gruppiert. Der Gesamtwert beginnt als ihr Mittel; sobald öffentliche Evidenz die Richtlinie für Hochrisikojurisdiktionen auslöst, wird die Bewertung angepasst und erhält die Obergrenze 49 (Gefährdet). AI Readiness liegt außerhalb.

44
Exzellent85-100Vorbildlich; erfüllt im Wesentlichen alle geprüften Kriterien
Gut70-84Gesund; geringfügige Lücken
Mittel50-69Akzeptabel mit deutlichen Lücken; Überprüfung empfohlen
Gefährdet30-49Erhebliche Schwächen; eine Übernahme erfordert Vorsicht
Kritisch1-29Schwerwiegende Probleme (aufgegeben, nur ein Maintainer, keine Hygiene)
VitalitätCommunity &VerbreitungNachhaltigkeit &GovernanceEngineering-QualitätSicherheitAI Readiness

Bewertungsprofil

Jede Achse ist eine Kategorie. Die Form zählt mehr als der Durchschnitt — ein gesundes Projekt füllt die gesamte Fläche, während ein Profil aus Spitzen und Kratern bedeutet, dass Stärke in einer Dimension Risiken in einer anderen verdeckt.

Eigentümerschaft

EsmaabiPersönliches Konto
5 Follower29 öffentliche Reposseit Feb. 2020

Dieses Repository gehört einem persönlichen Konto. Ein Projekt mit nur einem Eigentümer trägt ein höheres Kontinuitätsrisiko als ein organisationsgetragenes.

Paket-Ökosysteme

Metriken nach Kategorie

Vitalität

Lebt das Projekt — wird Code geschrieben und werden Releases ausgeliefert?

41Gefährdet · 22 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 5 Tagen
3.5/36Commit-Rhythmus — 5/52 Wochen mit Commits
18/18Commit-Volumen — 1.314 Commits im letzten Jahr
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Verwendete Eingangsdaten
commits_last_year1.314
human_commit_share1
days_since_last_push5
active_weeks_last_year5
Wie die Bewertung erfolgt
0/27Liefert Releases aus — keine Releases veröffentlicht
0/36Release-Aktualität — keine Releases
0/27Release-Rhythmus — keine Releases
0/10OpenSSF Scorecard: Signed-Releases — keine Daten
Verwendete Eingangsdaten
releases_count0
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: Signed-Releases. Die verbleibenden Gewichte wurden renormalisiert.

Community & Verbreitung

Hat das Projekt Nutzer, Downloads, Aufmerksamkeit und ein einladendes Umfeld für Beitragende?

37Gefährdet · 18 % des Gesamtindex
Wie die Bewertung erfolgt
13.7/60Stars — 8 Stars
0/25Forks — 2 Forks
0/15Watcher — 0 Watcher
Verwendete Eingangsdaten
forks2
stars8
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (MIT)
0/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
0/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
has_contributingnein
has_issue_templatenein
has_code_of_conductnein
has_pull_request_templatenein
Wie die Bewertung erfolgt
45.3/80Downloads pro Monat — 2.495 Downloads/Monat über npm
0/20Abhängige in der Registry — von diesem Ökosystem nicht ausgewiesen
Verwendete Eingangsdaten
packagespi-yaml-hooks
dependents
ecosystemsnpm
total_downloads
monthly_downloads2.495
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Abhängige in der Registry. Die verbleibenden Gewichte wurden renormalisiert.

Nachhaltigkeit & Governance

Überdauert das Projekt die Menschen, die es tragen — Bus-Faktor, Reaktionsfähigkeit, Trägerschaft und Paketpflege?

53Mittel · 24 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
0/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 100 % der Commits
1.4/13.5Breite der Beitragenden — 1 Beitragende
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Verwendete Eingangsdaten
bus_factor1
contributors_sampled1
top_contributor_share1
Wie die Bewertung erfolgt
0/46.8Issue-Lösungsquote — keine Issues oder keine Daten
38.2/38.3PR-Annahme — 14/14 entschiedene PRs gemergt
0/15OpenSSF Scorecard: Code-Review — Found 0/3 approved changesets -- score normalized to 0
Verwendete Eingangsdaten
merged_prs14
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Issue-Lösungsquote. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
10/30Organisatorische Trägerschaft — persönliches (Nutzer-)Konto
0/20Verifizierte Domain — für Nutzerkonten nicht anwendbar
5.6/25Reichweite des Inhabers — 5 Follower von KristjanPikhof
22.8/25Kontohistorie — 29 öffentliche Repos, Kontoalter ca. 6 Jahre
Verwendete Eingangsdaten
followers5
owner_typeUser
is_verified
owner_loginKristjanPikhof
public_repos29
account_age_days2.362
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Verifizierte Domain. Die verbleibenden Gewichte wurden renormalisiert.

Paketpflege

100Exzellent
Wie die Bewertung erfolgt
25/25Veröffentlicht & auflösbar — 1 Paket(e) auf npm
35/35Veröffentlichungsaktualität — letzte Veröffentlichung vor 5 Tagen
20/20Versionshistorie — 6 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packagespi-yaml-hooks
ecosystemsnpm
any_deprecatednein
min_days_since_publish5

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

54Mittel · 20 % des Gesamtindex
Wie die Bewertung erfolgt
0/24CI-Workflows
24/24Tests vorhanden
0/16Linter-Konfiguration
0/9.6Pre-Commit-Hooks
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — 0 out of 3 merged PRs checked by a CI test -- score normalized to 0
Verwendete Eingangsdaten
has_cinein
has_testsja
has_editorconfignein
has_linter_confignein
has_precommit_confignein

Dokumentation

100Exzellent
Wie die Bewertung erfolgt
30/30README
25/25Dokumentationsverzeichnis
15/15Dokumentations-/Homepage-Site — https://npmjs.com/package/pi-yaml-hooks
10/10Repository-Beschreibung
10/10Topics — 17 Topics
10/10Wiki
Verwendete Eingangsdaten
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_wikija
homepagehttps://npmjs.com/package/pi-yaml-hooks
has_readmeja
has_docs_dirja
has_descriptionja

Sicherheit

Sind die sichtbaren Sicherheits- und Lieferkettenpraktiken belastbar, ohne ungeklärte Exposition gegenüber Hochrisikojurisdiktionen?

30Gefährdet · 16 % des Gesamtindex

Sicherheitslage

30Gefährdet
Wie die Bewertung erfolgt
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 — keine Daten
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Lizenz — 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 — keine Daten
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 — keine Daten
0/7.5Token-Permissions — keine Daten
5.2/7.5Vulnerabilities — 3 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated14
scorecard_versionv5.5.0
checks_inconclusive4
scorecard_aggregate3
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): dangerous_workflow, packaging, signed_releases, token_permissions. Die verbleibenden Gewichte wurden renormalisiert.

AI Readiness

Wie gut ist das Repository dafür ausgestattet, mit KI-Coding-Agenten entwickelt und gepflegt zu werden? Ein unabhängiges, experimentelles Badge — Gewicht 0,0, es wird eigenständig ausgewiesen und verändert den Gesamt-Gesundheitswert nicht.

63Mittel · 0 % des Gesamtindex
Wie die Bewertung erfolgt
45/45Agentenanweisungen — AGENTS.md, CLAUDE.md
0/15Maschinenlesbare Doku (llms.txt)
40/40Lesbare Commit-Historie — 96 von 100 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share0,96
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes7.136
Wie die Bewertung erfolgt
0/18Bootstrap mit einem Befehl
22/22Automatisierte Tests
0/11Lint-/Format-Konfiguration
11/11Statische Typprüfung — tsconfig.json
10/10Reproduzierbare Umgebung — lockfile
0/10Belegte Agentenpraxis — keine von Agenten verfassten Commits unter den letzten 100
0/8Automatisierte Wartung — keine automatisierten Abhängigkeits-Updates beobachtet
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfilespackage-lock.json
has_dockerfilenein
typed_languageja
bootstrap_files
has_devcontainernein
has_linter_confignein
typecheck_configstsconfig.json
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0
Wie die Bewertung erfolgt
45/45Typprüfbarer Code — TypeScript (statisch typisiert)
53.4/55Handhabbare Dateigrößen — 2/68 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languageTypeScript
largest_source_bytes77.455
source_files_sampled68
oversized_source_files2
Wie die Bewertung erfolgt
0/40API-Schema (OpenAPI/GraphQL/proto)
0/20MCP-Server
40/40Lauffähige Beispiele — examples
Verwendete Eingangsdaten
example_dirsexamples
has_mcp_signalnein
api_schema_files

Eckdaten

8GitHub-Sterne
1Mitwirkende
1.314Commits, letzte 12 Monate
5Tage seit letztem Push
0Releases
1Bus-Faktor
0offene Issues
npmPaket-Ökosysteme

Warnungen zur Datenerhebung

  • 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

Weitere Details

Stern- und Fork-Verlauf 0 ★ / 2 ⇿
0Sterne
2Forks

Wann jeder Stern und Fork hinzugefügt wurde, von GitHub erfasst und nach Tagen gruppiert. Das kumulierte Wachstum steht direkt über den täglichen Zugängen, aus denen es besteht, sodass beide gegeneinander lesbar sind: stetiger organischer Zuwachs sieht ganz anders aus als ein abrupter, kurzlebiger Ausschlag. Wo dieser Unterschied messbar ist, wird er als Wachstumsauthentizität ausgewiesen.

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

Unabhängige, werkzeugneutrale Sicherheitsbewertung durch das quelloffene OpenSSF Scorecard. Jede Prüfung honoriert eine Sicherheits-Praxis, nicht das Werkzeug eines bestimmten Anbieters. Prüfungen, die Scorecard nicht ermitteln konnte, sind mit k. A. markiert und vom Sicherheitswert ausgeschlossen (nie als null gezählt).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
k. A.Dangerous-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
k. A.Packagingpackaging 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
k. A.Signed-Releasesno releases found
k. A.Token-PermissionsNo tokens found
7Vulnerabilities3 existing vulnerabilities detected
Direkte Abhängigkeiten 1
RegistryPaketVersionsvorgabeManifest
npmyaml^2.9.0package.json
Alle Abhängigkeiten nicht erhoben

Der aufgelöste Abhängigkeitssatz konnte für diesen Bericht nicht erhoben werden: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

JSON-Rohbericht maschinenlesbar
{
  "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"
}

Bewertungen sind Signale, keine Garantien. Sie spiegeln öffentlich sichtbare Praxis auf GitHub wider — kein Code-Audit und keine Sicherheitsgarantie.

Fehlende Daten werden ausgeschlossen und die Gewichte neu normiert, nie als null bewertet. Die Methodik ist versioniert und offen: Metriken v1.13.0, Schema v0.27.0 — vollständige Methodik · Metriken-Wiki.

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte Statistikennpm.