Public record
Software health reportschema 0.27.0 · metrics 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 stars⑂ 2 forkssince Apr 2026View on GitHub ↗

KristjanPikhof/Pi-YAML-Hooks holds a health index of 44 out of 100, placing it in the At risk band. It scores highest on AI Readiness (63/100) and lowest on Security (30/100). It was last updated 5 days ago. A single contributor accounts for most of its recent work.

44
overall / 100
At risk

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At risk ceiling of 49. AI Readiness sits outside the overall score.

44
Excellent85-100Exemplary; meets essentially all checked criteria
Good70-84Healthy; minor gaps
Moderate50-69Acceptable with notable gaps; review recommended
At risk30-49Significant weaknesses; adoption warrants caution
Critical1-29Severe problems (abandoned, single-maintainer, no hygiene)
VitalityCommunity &AdoptionSustainability &GovernanceEngineeringQualitySecurityAI Readiness

Score profile

Each axis is a category. The shape matters more than the average — a healthy subject fills the whole shape, while a spike-and-crater profile means strength in one dimension is masking risk in another.

Ownership

EsmaabiPersonal account
5 followers29 public repossince Feb 2020

This repository is owned by a personal account. A single-owner project carries more continuity risk than an organization-backed one.

Package ecosystems

Metrics by category

Vitality

Is the project alive — is code being written and are releases shipping?

41At risk · 22% of overall
How it's scored
36/36Push recency — last push 5 days ago
3.5/36Commit cadence — 5/52 weeks with commits
18/18Commit volume — 1,314 commits in the last year
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year1,314
human_commit_share1
days_since_last_push5
active_weeks_last_year5
How it's scored
0/27Ships releases — no releases published
0/36Release recency — no releases
0/27Release cadence — no releases
0/10OpenSSF Scorecard: Signed-Releases — no data
Inputs used
releases_count0
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.

Community & Adoption

Does the project have users, downloads, attention, and a welcoming setup for contributors?

37At risk · 18% of overall
How it's scored
13.7/60Stars — 8 stars
0/25Forks — 2 forks
0/15Watchers — 0 watchers
Inputs used
forks2
stars8
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (MIT)
0/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
How it's scored
45.3/80Monthly downloads — 2,495 downloads/month across npm
0/20Registry dependents — not reported by this ecosystem
Inputs used
packagespi-yaml-hooks
dependents
ecosystemsnpm
total_downloads
monthly_downloads2,495
Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.

Sustainability & Governance

Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?

53Moderate · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
0/22.5Commit distribution — top contributor authored 100% of commits
1.4/13.5Contributor breadth — 1 contributors
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Inputs used
bus_factor1
contributors_sampled1
top_contributor_share1
How it's scored
0/46.8Issue resolution — no issues or no data
38.2/38.3PR acceptance — 14/14 decided PRs merged
0/15OpenSSF Scorecard: Code-Review — Found 0/3 approved changesets -- score normalized to 0
Inputs used
merged_prs14
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.
How it's scored
10/30Ownership backing — personal (user) account
0/20Verified domain — not applicable to user accounts
5.6/25Owner reach — 5 followers of KristjanPikhof
22.8/25Track record — 29 public repos, account ~6 yr old
Inputs used
followers5
owner_typeUser
is_verified
owner_loginKristjanPikhof
public_repos29
account_age_days2,362
Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.
How it's scored
25/25Published & resolvable — 1 package(s) on npm
35/35Publish recency — latest publish 5 days ago
20/20Version history — 6 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packagespi-yaml-hooks
ecosystemsnpm
any_deprecatedno
min_days_since_publish5

Engineering Quality

Are baseline engineering and documentation practices in place?

54Moderate · 20% of overall
How it's scored
0/24CI workflows
24/24Tests present
0/16Linter config
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
Inputs used
has_cino
has_testsyes
has_editorconfigno
has_linter_configno
has_precommit_configno

Documentation

100Excellent
How it's scored
30/30README
25/25Documentation directory
15/15Documentation / homepage site — https://npmjs.com/package/pi-yaml-hooks
10/10Repository description
10/10Topics — 17 topics
10/10Wiki
Inputs used
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_wikiyes
homepagehttps://npmjs.com/package/pi-yaml-hooks
has_readmeyes
has_docs_diryes
has_descriptionyes

Security

Are visible security and supply-chain practices strong, without unresolved high-risk jurisdiction exposure?

30At risk · 16% of overall
How it's scored
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 — no data
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5License — 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 — no data
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 — no data
0/7.5Token-Permissions — no data
5.2/7.5Vulnerabilities — 3 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated14
scorecard_versionv5.5.0
checks_inconclusive4
scorecard_aggregate3
Excluded from scoring (no data or not applicable): dangerous_workflow, packaging, signed_releases, token_permissions. Remaining weights renormalized.

AI Readiness

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.

63Moderate · 0% of overall
How it's scored
45/45Agent instructions — AGENTS.md, CLAUDE.md
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 96 of 100 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.96
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes7,136
How it's scored
0/18One-command bootstrap
22/22Automated tests
0/11Lint / format config
11/11Static type checking — tsconfig.json
10/10Reproducible environment — lockfile
0/10Demonstrated agent practice — no agent-authored commits among the last 100
0/8Automated maintenance — no automated dependency updates observed
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Inputs used
has_nixno
has_testsyes
lockfilespackage-lock.json
has_dockerfileno
typed_languageyes
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configstsconfig.json
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0
How it's scored
45/45Type-checkable code — TypeScript (statically typed)
53.4/55Manageable file sizes — 2/68 source files over 60KB
Inputs used
primary_languageTypeScript
largest_source_bytes77,455
source_files_sampled68
oversized_source_files2
How it's scored
0/40API schema (OpenAPI/GraphQL/proto)
0/20MCP server
40/40Runnable examples — examples
Inputs used
example_dirsexamples
has_mcp_signalno
api_schema_files

Key facts

8GitHub stars
1contributors
1,314commits, last 12 months
5days since last push
0releases
1bus factor
0open issues
npmpackage ecosystems

Data collection 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

More detail

Star and fork history 0 ★ / 2 ⇿
0Stars
2Forks

When each star and fork was added, collected from GitHub and bucketed by day. Cumulative growth sits directly above the daily additions it is made of, so the two read against each other: steady organic accretion looks nothing like an abrupt, short-lived burst. Where that difference is measurable, it is reported as growth authenticity.

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

Independent, tool-agnostic security assessment from the open-source OpenSSF Scorecard. Each check rewards a security practice, not a specific vendor's tool. Checks Scorecard could not determine are marked n/a and excluded from the security score (never counted as zero).Scorecard v5.5.0 · 2026-07-23 09:52 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
0CI-Tests0 out of 3 merged PRs checked by a CI test -- score normalized to 0
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/3 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
n/aDangerous-Workflowno workflows found
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
n/aPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
n/aSigned-Releasesno releases found
n/aToken-PermissionsNo tokens found
7Vulnerabilities3 existing vulnerabilities detected
Direct dependencies 1
RegistryPackageVersion constraintManifest
npmyaml^2.9.0package.json
All dependencies not collected

The resolved dependency set could not be collected for this report: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Raw JSON report machine-readable
{
  "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"
}

Scores are signals, not warranties. They reflect publicly visible practices on GitHub — not a code audit, and not a security guarantee.

Missing data is excluded and weights renormalized, never scored as zero. Methodology is versioned and open: metrics v1.13.0, schema v0.27.0 — full methodology · metrics wiki.

How one result sits in the wider record: aggregate statisticsnpm.