Public record
Software health reportschema 0.26.0 · metrics 1.13.0 · 2026-07-22 03:07 UTC

csuzngjh / principles

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

TypeScriptMIT★ 1 star⑂ 1 forksince Jan 2026View on GitHub ↗

csuzngjh/principles holds a health index of 70 out of 100, placing it in the Good band. It scores highest on Vitality (87/100) and lowest on Community & Adoption (47/100). It was last updated today. A single contributor accounts for most of its recent work.

70
overall / 100
Good

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.

70
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

PDPersonal account
9 followers2 public repossince Dec 2014

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

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publishTags
npm@principles/pd-cli1.133.03,6287024 days ago
npmprinciples-disciple1.197.1317,6972324 days ago
npm@principles/core1.240.1019,8531974 days ago
npmcreate-principles-disciple1.104.03,5223418 days agoopenclawprinciples-disciplecliinstallerinteractive

Metrics by category

Vitality

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

87Excellent · 22% of overall
How it's scored
36/36Push recency — last push 0 days ago
13.8/36Commit cadence — 20/52 weeks with commits
18/18Commit volume — 1,712 commits in the last year
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 9 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year1,712
human_commit_share0.81
days_since_last_push0
active_weeks_last_year20

Release discipline

100Excellent
How it's scored
27/27Ships releases — 4 releases published
36/36Release recency — latest release 18 days ago
27/27Release cadence — a release every ~11.1 days
0/10OpenSSF Scorecard: Signed-Releases — no data
Inputs used
releases_count4
latest_release_tagv1.75.1
releases_from_tagsno
days_since_latest_release18
mean_days_between_releases11.1
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?

47At risk · 18% of overall
How it's scored
0/60Stars — 1 stars
0/25Forks — 1 forks
0/15Watchers — 0 watchers
Inputs used
forks1
stars1
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonbelow_threshold
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (MIT)
18/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
6.3/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingyes
has_issue_templateno
has_code_of_conductno
has_pull_request_templateyes
How it's scored
62/80Monthly downloads — 44,700 downloads/month across npm
0/20Registry dependents — not reported by this ecosystem
Inputs used
packages@principles/pd-cli, principles-disciple, @principles/core, create-principles-disciple
dependents
ecosystemsnpm
total_downloads
monthly_downloads44,700
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?

56Moderate · 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
4.1/13.5Contributor breadth — 3 contributors
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Inputs used
bus_factor1
contributors_sampled3
top_contributor_share0.998
How it's scored
46.8/46.8Issue resolution — 100% of issues closed
34.9/38.3PR acceptance — 1,007/1,105 decided PRs merged
6/15OpenSSF Scorecard: Code-Review — Found 9/19 approved changesets -- score normalized to 4
Inputs used
merged_prs1,007
open_issues0
closed_issues132
issue_closed_ratio1
closed_unmerged_prs98
How it's scored
10/30Ownership backing — personal (user) account
0/20Verified domain — not applicable to user accounts
7.2/25Owner reach — 9 followers of csuzngjh
15.5/25Track record — 2 public repos, account ~11 yr old
Inputs used
followers9
owner_typeUser
is_verified
owner_logincsuzngjh
public_repos2
account_age_days4,248
Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.
How it's scored
25/25Published & resolvable — 4 package(s) on npm
35/35Publish recency — latest publish 4 days ago
20/20Version history — 232 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packages@principles/pd-cli, principles-disciple, @principles/core, create-principles-disciple
ecosystemsnpm
any_deprecatedno
min_days_since_publish4

Engineering Quality

Are baseline engineering and documentation practices in place?

86Excellent · 20% of overall
How it's scored
24/24CI workflows — 12 workflow(s)
24/24Tests present
16/16Linter config — eslint.config.js
0/9.6Pre-commit hooks
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 28 out of 28 merged PRs checked by a CI test -- score normalized to 10
Inputs used
has_ciyes
has_testsyes
has_editorconfigno
has_linter_configyes
has_precommit_configno

Documentation

90Excellent
How it's scored
30/30README
25/25Documentation directory
15/15Documentation / homepage site — https://principles-website.pages.dev
10/10Repository description
10/10Topics — 12 topics
0/10Wiki
Inputs used
topicsai-agent, monorepo, openclaw, openclaw-plugin, principles, self-improving, sqlite, typescript, pain-signals, agent-governance, co-evolution, alignment-layer
has_wikino
homepagehttps://principles-website.pages.dev
has_readmeyes
has_docs_diryes
has_descriptionyes

Security

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

72Good · 16% of overall
How it's scored
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — no data
2.5/2.5CI-Tests — 28 out of 28 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
3/7.5Code-Review — Found 9/19 approved changesets -- score normalized to 4
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5License — license file detected
7.5/7.5Maintained — 30 commit(s) and 9 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
3/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 6
5/5SAST — SAST tool is run on all commits
5/5Security-Policy — security policy file detected
0/7.5Signed-Releases — no data
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 50 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate6.5
Excluded from scoring (no data or not applicable): branch_protection, signed_releases. Remaining weights renormalized.
How it's scored
35/35Direct dependencies free of known advisories — no direct dependency carries a known advisory
25/25Indirect dependencies free of known advisories — no indirect dependency carries a known advisory
0/40No advisories left outstanding — no advisory carries a publication date
Inputs used
sourceosv
advisories0
affected_packages0
assessed_packages161
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the npm:@principles/pd-cli@1.133.0 runtime dependency closure — what installing the published package pulls in — 161 packages. Reachability is not analyzed.

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.

80Good · 0% of overall
How it's scored
45/45Agent instructions — AGENTS.md, CLAUDE.md, GEMINI.md, packages/create-principles-disciple/templates/langs/en/core/AGENTS.md, packages/create-principles-disciple/templates/langs/zh/core/AGENTS.md, packages/openclaw-plugin/src/core/AGENTS.md, packages/openclaw-plugin/src/hooks/AGENTS.md, packages/openclaw-plugin/templates/langs/en/core/AGENTS.md, packages/openclaw-plugin/templates/langs/zh/core/AGENTS.md, packages/website/video/homepage-demo/AGENTS.md, packages/website/video/homepage-demo/CLAUDE.md
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 81 of 81 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share1
agent_instruction_filesAGENTS.md, CLAUDE.md, GEMINI.md, packages/create-principles-disciple/templates/langs/en/core/AGENTS.md, packages/create-principles-disciple/templates/langs/zh/core/AGENTS.md, packages/openclaw-plugin/src/core/AGENTS.md, packages/openclaw-plugin/src/hooks/AGENTS.md, packages/openclaw-plugin/templates/langs/en/core/AGENTS.md, packages/openclaw-plugin/templates/langs/zh/core/AGENTS.md, packages/website/video/homepage-demo/AGENTS.md, packages/website/video/homepage-demo/CLAUDE.md
agent_instruction_max_bytes22,917
How it's scored
0/18One-command bootstrap
22/22Automated tests
11/11Lint / format config — eslint.config.js
11/11Static type checking — packages/create-principles-disciple/tsconfig.json, packages/openclaw-plugin/tsconfig.json, packages/pd-cli/tsconfig.json, packages/pd-console/tests/e2e/tsconfig.json, packages/pd-console/tsconfig.json, packages/principles-core/tsconfig.json, scripts/nocturnal/tsconfig.json, tests/e2e-fixtures/trap-01-circular-dep/tsconfig.json, tsconfig.json
10/10Reproducible environment — lockfile
2/10Demonstrated agent practice — 1 of the last 100 commits agent-authored or agent-credited
8/8Automated maintenance — 19 of the last 100 commits are automated dependency updates
6/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 6
Inputs used
has_nixno
has_testsyes
lockfilespackage-lock.json
has_dockerfileno
typed_languageyes
bootstrap_files
has_devcontainerno
has_linter_configyes
typecheck_configspackages/create-principles-disciple/tsconfig.json, packages/openclaw-plugin/tsconfig.json, packages/pd-cli/tsconfig.json, packages/pd-console/tests/e2e/tsconfig.json, packages/pd-console/tsconfig.json, packages/principles-core/tsconfig.json, scripts/nocturnal/tsconfig.json, tests/e2e-fixtures/trap-01-circular-dep/tsconfig.json, tsconfig.json
agent_commit_share0.01
toolchain_manifests
dependency_bot_commit_share0.19
How it's scored
45/45Type-checkable code — TypeScript (statically typed)
54.4/55Manageable file sizes — 16/1,463 source files over 60KB
Inputs used
primary_languageTypeScript
largest_source_bytes200,404
source_files_sampled1,463
oversized_source_files16

Key facts

1GitHub stars
3contributors
1,712commits, last 12 months
0days since last push
4releases
1bus factor
0open issues
npmpackage ecosystems

Data collection warnings

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

More detail

Star and fork history 1 ★ / 1 ⇿
1Stars
1Forks
3Releases

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.

0001111112026-052026-062026-06
Major 0Minor 2Patch 1
OpenSSF Scorecard 6.5 / 10
6.5aggregate

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-22 03:07 UTC

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

Dependency advisories 0

Installing npm:@principles/pd-cli@1.133.0 pulls in 161 packages, direct and transitive: 0 carry known advisories, of which 0 are direct dependencies.

No known advisories affect the assessed dependencies.

An advisory means the version recorded in the dependency graph falls inside an advisory’s affected range. Reachability is not analysed, and the graph includes development and test pins — a finding may concern tooling rather than shipped software.

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

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.26.0 — full methodology · metrics wiki.

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