公开记录
软件健康报告模式 0.26.0 · 指标 1.13.0 · 2026-07-22 10:36 UTC

gabelul / bpx-mono

Booplex pi extensions — multi-model AI consultation, councils, and tools for coding sessions

TypeScriptMIT★ 3 星标⑂ 0 复刻始于 2026年6月在 GitHub 上查看 ↗

gabelul/bpx-mono 的健康指数为 100 分中的 54 分,处于「中等」区间。 其得分最高的类别是Vitality(74/100),最低的是Security(26/100)。 最近一次更新在今天。

54
总分 / 100
中等

软件健康指数

指标归入加权类别,统一采用 1–100 量表。总体分先取类别加权平均;当公开证据触发高风险司法辖区政策时,评级会按政策调整,并设置 49(有风险)的上限。AI 就绪度不计入总体分。

54
优秀85-100堪称典范;基本满足所有检验标准
良好70-84健康;仅有轻微不足
中等50-69可接受,但存在明显不足;建议进行审查
存在风险30-49存在重大薄弱环节;采用时应保持审慎
危急1-29问题严重(项目被弃置、仅有单一维护者、缺乏基本工程规范)
活力社区与采用可持续性与治理工程质量安全AI 就绪度

评分画像

每条轴代表一个类别。形状比平均值更重要——健康的对象会填满整个图形,而“一峰一谷”式画像意味着某一维度的优势正掩盖另一维度的风险。

所有权

Gabi Florea个人账户
2 关注者42 个公开仓库始于 2014年8月Booplex

该仓库由个人账户拥有。相较于组织支持的项目,单一所有者项目的延续性风险更高。

软件包生态系统

注册表软件包版本月下载量版本数最近发布标签
npm@booplex/bpx-consult0.10.12,402174 天前pi-packagepi-extensionbpxadvisorcouncilconsensusmulti-model

按类别列示的指标

活力

项目是否仍有生命——是否仍在编写代码,是否仍在发布版本?

74良好 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 0 天前
2.8/36提交节奏 — 52 周中有 4 周有提交
18/18提交量 — 最近一年 109 次提交
0/10OpenSSF Scorecard:Maintained — project was created within the last 90 days. Please review its contents carefully
所用输入
commits_last_year109
human_commit_share0.83
days_since_last_push0
active_weeks_last_year4

发布纪律

100优秀
评分方式
27/27有发布版本 — 已发布 17 个发布版本
36/36发布时效 — 最近一次发布版本于 4 天前
27/27发布节奏 — 约每 0.3 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — 无数据
所用输入
releases_count17
latest_release_tagv0.10.1
releases_from_tags
days_since_latest_release4
mean_days_between_releases0.3
已排除计分(无数据或不适用):OpenSSF Scorecard:Signed-Releases。 其余权重已重新归一化。

社区与采用

项目是否拥有用户、下载量与关注度,并具备欢迎贡献者参与的配置?

40存在风险 · 占总体的 18%
评分方式
4.9/60星标 — 3 个星标
0/25复刻 — 0 个复刻
0/15关注者 — 0 位关注者
所用输入
forks0
stars3
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

70良好
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(MIT)
18/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
0/6.3PR 模板
所用输入
has_readme
has_license
has_contributing
has_issue_template
has_code_of_conduct
has_pull_request_template
评分方式
45.1/80月度下载量 — npm 合计每月 2,402 次下载
0/20注册表被依赖数 — 该生态系统不报告此项
所用输入
packages@booplex/bpx-consult
dependents
ecosystemsnpm
total_downloads
monthly_downloads2,402
已排除计分(无数据或不适用):注册表被依赖数。 其余权重已重新归一化。

可持续性与治理

项目能否在其成员之外延续——巴士系数、响应能力、由谁支持,以及软件包的维护状况?

71良好 · 占总体的 24%
评分方式
0/46.8议题解决 — 没有议题或无数据
38.2/38.3PR 接受 — 已裁定的 PR 中 17/17 已合并
0/15OpenSSF Scorecard:Code-Review — Found 0/23 approved changesets -- score normalized to 0
所用输入
merged_prs17
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
已排除计分(无数据或不适用):议题解决。 其余权重已重新归一化。
评分方式
10/30所有权背书 — 个人(用户)账户
0/20已验证域名 — 不适用于个人账户
3.4/25所有者影响力 — gabelul 有 2 位关注者
23.9/25既往记录 — 42 个公开仓库,账户约 11 年
所用输入
followers2
owner_typeUser
is_verified
owner_logingabelul
public_repos42
account_age_days4,358
已排除计分(无数据或不适用):已验证域名。 其余权重已重新归一化。
评分方式
25/25已发布且可解析 — npm 上有 1 个软件包
35/35发布时效 — 最近一次发布于 4 天前
20/20版本历史 — 17 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packages@booplex/bpx-consult
ecosystemsnpm
any_deprecated
min_days_since_publish4

工程质量

基础的工程与文档实践是否到位?

49存在风险 · 占总体的 20%

工程实践

48存在风险
评分方式
24/24CI 工作流 — 2 个工作流
24/24存在测试
0/16Linter 配置
0/9.6Pre-commit 钩子
0/6.4.editorconfig
0/20OpenSSF Scorecard:CI-Tests — 0 out of 7 merged PRs checked by a CI test -- score normalized to 0
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config

文档

50中等
评分方式
30/30README
0/25文档目录
0/15文档 / 主页站点
10/10仓库描述
0/10主题标签
10/10Wiki
所用输入
topics
has_wiki
homepage
has_readme
has_docs_dir
has_description

安全

可见的安全与供应链实践是否稳固,且不存在未解决的高风险司法辖区暴露?

26危急 · 占总体的 16%

安全态势

26危急
评分方式
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — 0 out of 7 merged PRs checked by a CI test -- score normalized to 0
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/23 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5许可证 — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — 无数据
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 15 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate2.6
已排除计分(无数据或不适用):signed_releases。 其余权重已重新归一化。

AI 就绪度

该仓库在多大程度上具备与 AI 编码代理协同开发与维护的条件?这是一枚独立的实验性徽章——权重为 0.0,因此单独呈现,不影响总体健康评分。

52中等 · 占总体的 0%
评分方式
0/45代理指令 — 没有 CLAUDE.md / AGENTS.md / 编辑器规则
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 83 次人类提交中有 71 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.855
agent_instruction_files
agent_instruction_max_bytes
评分方式
0/18一条命令的引导启动
22/22自动化测试
0/11Lint / 格式化配置
11/11静态类型检查 — packages/bpx-consult/tsconfig.json
10/10可复现环境 — lockfile
0/10已体现的代理实践 — 最近 100 次提交中没有代理编写的提交
0/8自动化维护 — 未观察到自动依赖更新
0/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
所用输入
has_nix
has_tests
lockfilespackage-lock.json, pnpm-lock.yaml
has_dockerfile
typed_language
bootstrap_files
has_devcontainer
has_linter_config
typecheck_configspackages/bpx-consult/tsconfig.json
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0
评分方式
45/45可类型检查的代码 — TypeScript(静态类型)
55/55可控的文件大小 — 采样的 46 个源文件中有 0 个超过 60KB
所用输入
primary_languageTypeScript
largest_source_bytes43,534
source_files_sampled46
oversized_source_files0

关键数据

3GitHub 星标
-贡献者
109最近 12 个月提交数
0距最近推送天数
17发布版本数
-巴士系数(bus factor)
0开放议题
npm软件包生态系统数

数据采集警告

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • No human contributors found; every contributor is an automation account
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository
  • deps.dev does not index npm:@booplex/bpx-consult@0.10.1; advisories assessed against the repository dependency graph instead

更多细节

OpenSSF Scorecard 2.6 / 10
2.6综合

来自开源项目 OpenSSF Scorecard 的独立、工具无关的安全评估。每项检查奖励的是安全实践本身,而非特定供应商的工具。Scorecard 无法判定的检查项标记为 不适用,并从安全评分中剔除(绝不按零分计)。Scorecard v5.5.0 · 2026-07-22 10:36 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
0CI-Tests0 out of 7 merged PRs checked by a CI test -- score normalized to 0
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/23 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
不适用Signed-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities15 existing vulnerabilities detected
直接依赖 1
注册表软件包版本约束清单文件
npm@juicesharp/rpiv-config^1.20.0packages/bpx-consult/package.json
全部依赖 未采集

本报告未能采集到解析后的依赖集合:GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 9199,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "TypeScript": 390997
      },
      "pushed_at": "2026-07-21T13:59:32Z",
      "created_at": "2026-06-30T00:52:26Z",
      "owner_type": "User",
      "updated_at": "2026-07-22T05:18:31Z",
      "description": "Booplex pi extensions — multi-model AI consultation, councils, and tools for coding sessions",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript"
      ]
    },
    "owner": {
      "blog": "https://booplex.com",
      "name": "Gabi Florea",
      "type": "User",
      "login": "gabelul",
      "company": "Booplex",
      "location": null,
      "followers": 2,
      "avatar_url": "https://avatars.githubusercontent.com/u/8458444?v=4",
      "created_at": "2014-08-15T14:27:19Z",
      "is_verified": null,
      "public_repos": 42,
      "account_age_days": 4358
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.10.1",
          "kind": "patch",
          "published_at": "2026-07-17T11:04:22Z"
        },
        {
          "tag": "v0.10.0",
          "kind": "minor",
          "published_at": "2026-07-16T20:42:05Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-07-16T18:58:24Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-07-16T18:18:32Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-07-16T17:35:49Z"
        },
        {
          "tag": "v0.6.2",
          "kind": "patch",
          "published_at": "2026-07-16T14:24:45Z"
        },
        {
          "tag": "v0.6.1",
          "kind": "patch",
          "published_at": "2026-07-16T12:15:40Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-07-16T11:09:29Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-07-14T13:05:03Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-07-14T12:25:47Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-07-10T12:04:09Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-07-08T18:47:44Z"
        },
        {
          "tag": "v0.1.5",
          "kind": "patch",
          "published_at": "2026-07-07T14:09:07Z"
        },
        {
          "tag": "v0.1.4",
          "kind": "patch",
          "published_at": "2026-07-07T11:49:02Z"
        },
        {
          "tag": "v0.1.3",
          "kind": "patch",
          "published_at": "2026-07-06T11:33:58Z"
        },
        {
          "tag": "v0.1.2",
          "kind": "patch",
          "published_at": "2026-07-05T19:32:02Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2026-07-05T19:24:09Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "34ffc64dabf4d470ac1859b4bf0688577fe689e6",
          "body": null,
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main'",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-21T13:57:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5c4f36484898367e6c648818e7c6b99f8d4bc37a",
          "body": "Advisor round 5: the previous test only checked addEventListener was a function\n— deleting removeAbortListener() would leave all tests green. Now instruments\nremoveEventListener on the inner signal inside fn and asserts exactly 1 abort\nremoval after withTimeout returns. Goes red if the cleanup is deleted.\n\n268 tests, tsc clean. Production code declared sound by advisor.",
          "is_bot": false,
          "headline": "test(timeout): verify abort listener removal is real, not vacuous",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-21T11:56:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3b7428e983819dc21f39ec9af18f70d33e5a6abe",
          "body": "…mally\n\nAdvisor round 4: the abortPromise attaches a listener to ctrl.signal for the\nPromise.race. When fn resolves before the timeout, that listener lingered on\nctrl.signal until GC — fine in most cases, but a leak if the callback retains\nthe signal.\n\nFix: store the handler and call removeAbortListener() in finally, alongside\nclearTimeout and cleanup. 1 test verifies fn-retains-signal path.",
          "is_bot": false,
          "headline": "fix(timeout): remove abort listener from ctrl.signal when fn wins nor…",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-21T11:51:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b217d57ad7e03f6bbfe45f0ecb707bc495d2f472",
          "body": "Advisor round 3 found: fnPromise = fn(ctrl.signal) runs before the try block.\nIf fn throws synchronously (not a rejected promise), the throw skips the\ntry/catch, leaking clearTimeout + cleanup.\n\nFix: Promise.resolve().then(() => fn(ctrl.signal)) normalizes sync throws\ninto promise rejections that the try/catch handles. 1 regression test verifies\na sync throw returns { ok: false } with zero retained listeners.",
          "is_bot": false,
          "headline": "fix(timeout): normalize sync throws so withTimeout can't leak",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-21T11:43:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6dce8817edcfc8d743b5827149f2020699d6b44e",
          "body": "…anscript\n\nTwo findings from second advisor review:\n\n1. withTimeout could hang forever if fn ignored the abort signal. The timer\n   fired ctrl.abort() but 'await fn()' blocked because fn wasn't listening.\n   Fix: Promise.race between fn and an abort-listener promise. The abandoned\n   fn's eventual r\n[…]\nborted check in callStep: a response arriving after the\nsignal aborted is rejected, not treated as success. Handles the race where a\nprovider responds just as the timeout fires.\n\n266 tests, tsc clean.",
          "is_bot": false,
          "headline": "fix(debate+timeout): withTimeout can't hang, synthesizer gets full tr…",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-21T11:33:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fe06e6cf789ea08a9ea5db4efce73ca5d2e54351",
          "body": "Advisor review found two test gaps:\n\n1. Timeout path untested — no flow test triggered the real withTimeout abort.\n   Added a signal-aware callAdvisor mock (entries with delayMs race the delay\n   against the abort signal). New test: round-1 advocate succeeds, round-1\n   critic stalls past a 50ms bud\n[…]\nt. New test: synthesizer returns {text:'truncated verdict', stopReason:\n   'error'} → assert the completed debate is returned, not the truncated text\n   as a successful verdict.\n\n262 tests, tsc clean.",
          "is_bot": false,
          "headline": "test(debate): add timeout-path and synth-stopReason flow tests",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-21T11:09:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "eb074b3d414a6738d0838625e5e34c87f2e00fd1",
          "body": "… race\n\nAdvisor noted that { ...details } shallow-copies — the steps array is shared by\nreference. If withTimeout resolves (timeout) before the aborted callback settles,\na late pushStep inside that callback mutates the steps array after the result is\nalready in the caller's hands.\n\nFix: copy steps a\n[…]\nint). Every\nreturn path — bail, timeout handler, normal success — goes through one of these,\nso the snapshot is unconditional. roundLog is already stable (joined into a\nstring by formatDebatePartial).",
          "is_bot": false,
          "headline": "fix(debate): snapshot steps array at return to close timeout mutation…",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-21T10:59:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "11a44a66ddfd221b245dfb9328458fde09f83cba",
          "body": "…eservation\n\nTwo findings from advisor code review:\n\n1. Synthesizer failure check only handled !synthResult.text, missing the case\n   where stopReason is 'error' or 'aborted' WITH partial text. A truncated synth\n   response with a provider error would slip through as ok(). Now mirrors\n   callStep's \n[…]\nate fails → bare error (nothing completed)\n\n   These go red if bail() calls are removed or roundLog is moved back inside\n   withTimeout. The pure-function tests alone would not.\n\n260 tests, tsc clean.",
          "is_bot": false,
          "headline": "fix(debate): synthesizer stopReason check + flow tests for partial pr…",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-21T10:54:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1ebe8af8282ae7d687cc0d7b9741d099d13529ba",
          "body": "Same bug Claude Code found in bpx-council's debate mode exists here: every\nfailure path was an early 'return err(error)' that discarded the advocate/critic\nturns already in local variables. A 6-minute debate that lost its last call\nreturned a one-line error instead of the argument it produced.\n\nAll \n[…]\nor cross-applicability.\nThe multi-model bug (#6) was already solved in bpx-consult (persona-scoped\nbackend routing). The CLI arg bugs (#1, #5) don't apply to a pi extension.\nThis was the one that did.",
          "is_bot": false,
          "headline": "fix(debate): mid-debate failure no longer discards completed rounds",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-21T10:35:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d1eef5f0a05523027a2a41e719ab02768a721e56",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release 0.10.1 (#17)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-17T11:04:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "376734cc826b2c9c031b2ed097588b84b5c00e51",
          "body": "…ing user message\n\nTwo §P-class failures surfaced in live sessions, both fixed in one release.\n\nBug A — 'prompt is too long' (a 1M-token session overshot a 1M model by 0.3%).\nThe token estimate (chars/3 × 1.15) undercounted, so the engine thought the\nsession fit and skipped truncation; the real coun\n[…]\nent it matters most. 252 tests: trailing-\nuser guarantee (3), margin subtraction, isTooLongError matching real Anthropic/\ncontext-length errors AND not matching the unrelated prefill error. tsc clean.",
          "is_bot": false,
          "headline": "fix: advisor no longer dies on long sessions — too-long retry + trail…",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-17T11:00:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a0f3bea2ab1b2094e784f70b698348c11be09df5",
          "body": "… layer)\n\nThe persona (assume Gabi's voice) is a memory step at write-time; this makes the\nevidence of skipping it mechanical. tests/docs-voice.test.ts greps the package\nREADME, package SPEC, and root README for banned slop tells (delve, leverage,\nrobust, seamless, landscape, 'let's dive', 'it's imp\n[…]\no high-signal/low-false-positive tells only — anything with a legit\ntechnical use is left out so the guard doesn't cry wolf. Living list. CONTRIBUTING\nupdated to reference both guards (stale + voice).",
          "is_bot": false,
          "headline": "test: CI guard against AI-slop voice in docs (the persona-enforcement…",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-17T09:07:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "00fade783e8e266d976df033c7fe2ed2d24f5636",
          "body": "The recurring doc-drift failure mode is updating a feature bullet and missing a\nsibling section that repeats the old claim. This makes it mechanical, not\nmemory-based: a failing CI test instead of waiting for the user to spot it on\nthe live site.\n\ntests/docs-stale.test.ts greps the package README, p\n[…]\nbehavior.\n\nAlso added a 'Keeping docs honest' section to CONTRIBUTING.md — the grep-the-\nold-claim checklist and the evergreen-root-README rule, so the discipline is\nwritten down, not just in my head.",
          "is_bot": false,
          "headline": "test: CI guard against stale docs + fix the SPEC claim it caught",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-16T21:37:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6cd156545fef24201ed58c75a1cd3b20785243ad",
          "body": "…ting)\n\nA piecemeal-edit audit caught two spots that still described custom CLI as\nconfig-file-only after it became menu-reachable in 0.10.0:\n\n- Council members closing paragraph said 'Custom CLI commands... still live in\n  the config file' — now only advanced settings (char caps, timeouts) do.\n- Ba\n[…]\ned since, the CHANGELOG is the record, and a forward-\nlooking roadmap shouldn't carry a partial shipped list that ages.\n\nVerified: no remaining 'config-file-only' / 'JSON-only' / stale contradictions.",
          "is_bot": false,
          "headline": "docs: fix README drift after 0.7–0.10 (custom CLI, persona-scoped rou…",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-16T21:10:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "292ef9c2dfa4d1429d10c110eb5c065b994139b6",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release 0.10.0 (#16)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-16T20:41:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2a0bf6a33de582fbfb63cbb2d039332532b2e5c4",
          "body": null,
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main'",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-16T20:41:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "70fa04cb77ff4cf4a54b91d6a9742fb2055a37cd",
          "body": "Closes the last menu gap (council Plan A). The backend picker now has a\n'Custom CLI…' entry alongside the three presets, so a user with gemini-cli,\nqwen, or any in-house agent can route a council seat to it from /consult\ninstead of editing JSON.\n\nFlow per the council's spec:\n- ctx.ui.input for the e\n[…]\n40 tests (was 232): parseCliArgs edge cases (blanks, trailing commas,\ninjection-safety), parseContextWindow (required/positive-int/no-fallback),\nbuildBackendItems includes the custom entry. tsc clean.",
          "is_bot": false,
          "headline": "feat: custom-CLI menu entry — route a seat to any installed CLI",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-16T20:40:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ae3fe503003825e73d1d9078e2bdf44e35d03c24",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release 0.9.0 (#15)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-16T18:58:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "04c1737ed974dc888a8c0a287342eab871dded21",
          "body": null,
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main'",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-16T18:57:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eb5ffb054daf0d45d03446579792ed8d7b9f017a",
          "body": "… models\n\nTwo tidy-ups the live menu made obvious, plus the gut-check advisor's correction.\n\n1. Collapse: the main /consult menu had per-member rows (Council — architect\n   model: …) that routed to a BARE model picker — a dead-end 'basic' path with\n   no Test, no Set backend, while the full member-d\n[…]\nf the currently-assigned route.\n\n232 tests (was 231): probeInlineModel registry-miss fast-fail; buildMainMenu\ncollapse shape (one council entry, no persona.*/council.synth rows, ≤10 items).\ntsc clean.",
          "is_bot": false,
          "headline": "feat(consult-ui): collapse main menu + test-before-assign for council…",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-16T18:57:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "164c71035420b52ba05a3741c5e6f3671e8b1694",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release 0.8.0 (#14)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-16T18:18:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "415047becc14abe852aa07b8d0c747b63684f896",
          "body": null,
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main'",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-16T18:17:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "763ab68b1a5e0def3231e88f1020d253c9cb1d27",
          "body": "…igning a seat\n\nThe Test action in a member's detail submenu now probes the counselor's EFFECTIVE\nroute (inline model OR CLI backend) using the persona's actual stance-injected\nprompt, not just CLI. For inline this is the test that would have caught the\ndead minimax/deepseek/openrouter keys before t\n[…]\n CLI\n→ not-on-PATH / timed out / nonzero exit / empty / responded. 30s cap so a dead\nroute fails fast. The menu label is now 'Test this model + persona (probe)' for\nboth routes.\n\n233 tests, tsc clean.",
          "is_bot": false,
          "headline": "feat: test-probe works for inline models too — catch a 401 before ass…",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-16T18:17:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0eba85138c8a59d19f66644fe311fb070e6c2627",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release 0.7.0 (#13)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-16T17:35:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4c400486f05666acc1d1812b7fada63addd3675a",
          "body": null,
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main'",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-16T17:33:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "25275706a1393af00d9813cc8f241ed28f01057d",
          "body": "Builds the council's recommendation (a 'proper B', not a thin menu). The live\ncouncil call that returned the recommendation also proved the mixed CLI council\nworks; this makes it settable without editing JSON.\n\nPersona-scoped routing (council §1): a backend on the persona takes precedence\nover the l\n[…]\n council.\n\n233 tests (was 227): persona-scoped routing (two seats same model, different\nroutes), declared-window vs preset vs custom-no-window pre-fail, backend\nbuilder + route-description. tsc clean.",
          "is_bot": false,
          "headline": "feat: CLI backend config in the /consult menu — persona-scoped routing",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-16T17:33:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c0e505d382640898f55abe019703993f206eb5f2",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release 0.6.2 (#12)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-16T14:24:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "353c9754c365587d71576842e73f83aa5016809f",
          "body": null,
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main'",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-16T14:22:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "657b96e33c07ec5af51767c7ceba26c93915a948",
          "body": "…ation\n\nThe 0.6.1 repair (repairToolPairing) was wired into fitToWindow — but the real\npipeline (buildConsultContext → priorityFill + assembleAndReduce, the §E.0\nevidence-aware fit from 0.2.0) doesn't call fitToWindow. So the repair never\nran for the actual advisor context. A second live council cal\n[…]\nhan result with a huge\nwindow (no truncation) now gets repaired at buildConsultContext's output,\nwhere before it sailed through.\n\n227 tests (was 226): +1 buildConsultContext unconditional-repair test.",
          "is_bot": false,
          "headline": "fix(context): run tool-pair repair unconditionally, not only on trunc…",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-16T14:18:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8070c50dba92548025ddec056d1bfabb55f728f6",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release 0.6.1 (#11)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-16T12:15:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "af64ac5cf6bb7da7dc3ecc5039bebc23c2695def",
          "body": null,
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main'",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-16T12:12:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d4fb37b1f19d5348443f0f65f6dfa8b8c1c1f9ef",
          "body": "…uncation\n\nA live council call caught what every unit test missed: the critic seat on\nAnthropic 400'd with 'unexpected tool_use_id found in tool_result blocks — each\ntool_result must have a corresponding tool_use.' The sliding window kept a\ntoolResult in the tail but dropped its toolCall in the midd\n[…]\no orphan survives in either direction.\n\n226 tests (was 218): 8 new — orphan result, dangling call, call-text survival,\npaired-keep, mixed batch, no-op, idempotency, and the live-bug fitToWindow repro.",
          "is_bot": false,
          "headline": "fix(context): repair tool_use/tool_result pairing after window-fit tr…",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-16T12:11:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "795bda427dcac54091ba2fadf8f82d51a23893f2",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release 0.6.0 (#10)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-16T11:09:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "530ee353b49dcdb8a15f7f916526379bff7d249b",
          "body": "…es it\n\nCouncil members can now be inline (completeSimple) or CLI (codex/claude/opencode\nvia spawn), mixed freely in one roster and fanned out in parallel. This is the\nfix for the failure you hit: three members on one provider, parallel fan-out,\nall aborted. Seat an inline architect + a codex-backed\n[…]\ntered vs registry window\nwhen registered, mixed-roster routing, pre-failed + resolved coexistence.\ntsc clean.\n\nRoadmap: moved out of 'Before 1.0' (shipped); smarter retry is now the sole\npre-1.0 item.",
          "is_bot": false,
          "headline": "feat: mixed inline+CLI council — one provider dying no longer collaps…",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-16T11:03:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ec0b725e2e72af8cdfb4d774d3d956ee8e1232f6",
          "body": "The roadmap said 'v1.1' and 'v2' but the package is 0.5.0 pre-1.0, so the\nmilestone names misled (v1.1 reads as 'after 1.0', which hasn't shipped).\nRelabeled into 'Before 1.0' (mixed CLI council, smarter retry) and 'After 1.0'\n(research-backed council, memory compression) with a one-line framing note.",
          "is_bot": false,
          "headline": "docs: fix roadmap labels — pre-1.0 milestone framing, not v1.1/v2",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-16T09:47:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b1d01a20ad292ee728da57b346f4e5a8a31fb551",
          "body": null,
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main'",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-14T14:32:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "919ec082e036fbed82a2ce28800a29f3ee763a24",
          "body": "The submenu does five things now (assign model, enable/disable, add manual,\nadd AI-generated, synthesizer). One dense sentence per feature was hard to\nscan. Bulleted list under a one-line intro, same content.",
          "is_bot": false,
          "headline": "docs: break the Council members paragraph into a scannable list",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-14T14:28:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6de588e81b5867fe27ae2938fe48153d250e75eb",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release 0.5.0 (#9)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-14T13:04:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1088684702cdb38d5fd0eefd2ca7588657e7cfae",
          "body": null,
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main'",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-14T13:02:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "916796cfe5c87c8868bcbdd4eec6c69e760a30b7",
          "body": "Mirrors the agent-generation pattern from tintinweb/pi-subagents, adapted to\nbpx-consult: instead of spawning a subagent to write a markdown file, we call\nan advisor directly (callAdvisor/completeSimple) to draft a small structured\npersona object, because a persona is {name, stance, systemPrompt}, n\n[…]\nstep shows the drafted name/stance/prompt and offers\noverwrite (if the name clashes), regenerate, or cancel.\n\n209 tests (was 191): 18 new persona-gen tests covering every parsing edge case.\ntsc clean.",
          "is_bot": false,
          "headline": "feat: AI-generated council personas from a focus description",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-14T13:01:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "74cd60c3182ff84a5b11e46fd4dd700a2bc595d9",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release 0.4.0 (#8)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-14T12:25:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4854aed4a090209233f938c863bcb808645b0dc2",
          "body": "Two things in one, because the bug and the feature touch the same code.\n\nBug: all council members ran on the same model and aborted. Root cause was\nmergeDefaults doing 'personas: user.personas ?? {}' — when the user's config\nhad no personas block, the bundled default roster (architect/opus, critic/\n\n[…]\n, council-menu builder engineered for edge\ncases (empty roster, unseated-count, none-available), and a regression test\nproving an empty config surfaces the 3 default tier-distinct personas. tsc\nclean.",
          "is_bot": false,
          "headline": "feat: council roster management in /consult + fix default-personas merge",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-14T12:22:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "71fb36b59273476bead436c84f763f19b186ff12",
          "body": "The 0.3.0 publish crashed with 'Cannot find module sigstore' — the\n'npm install -g npm@latest' step self-upgraded to an npm whose global\ninstall was missing the sigstore dep --provenance needs. Chasing\nnpm@latest is a moving target. Node 24 bundles npm 11 (OIDC + working\nprovenance), so use the distro npm and drop the fragile self-upgrade.",
          "is_bot": false,
          "headline": "ci: use Node 24 bundled npm for publish, drop npm@latest self-upgrade",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-10T12:07:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "54e9aeb8f80d3c8e7b44d972aff32444216f794e",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release 0.3.0 (#7)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-10T12:03:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6556a820d6b00899a1dbadbf02f727184a254a00",
          "body": "resolveAdviseMode (dynamic active/idle selection) was never reused —\ndeliver() is bpx-consult's own. The sendUserMessage deliverAs pattern is\nthe part that carried over.",
          "is_bot": false,
          "headline": "docs(spec): correct §R reuse-map steering-injection row",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-10T12:03:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f590cfaf70baa9f8eca1e5d8e42d4d20102bbc51",
          "body": "- §F described reusing pi-extensions resolveAdviseMode for dynamic\n  active/idle mode selection — never built. feedbackMode is a static\n  config setting. Rewrote to match the shipped deliver(): show via\n  message renderer (+ agent-run suppression on phrase path), scope note\n  (model's own consult() \n[…]\nuse it), and the now-real\n  per-mode override (resolveFeedbackMode).\n- §F show path said ctx.ui.notify; actual impl is a registered renderer.\n- §M debate: state rounds are configurable 1–4, default 2.",
          "is_bot": false,
          "headline": "docs(spec): correct §F feedback injection + §M debate rounds",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-10T12:02:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ca794fa68bc47424913a5f6c519816e9f191d872",
          "body": "The mode schemas carried a feedbackMode field that was parsed but never\nread — only the top-level default did anything. Rather than drop the dead\nfield, make it real: resolveFeedbackMode() gives a per-mode override\nprecedence over the top-level default (which still falls back to steer).\n\nLets you sa\n[…]\nbackMode applies to — the\nmodel's own consult() returns a tool result, auto-triggers hardcode their\ndelivery). Documented in the README; 5 new tests cover precedence + the\ngut-check/gutCheck key shim.",
          "is_bot": false,
          "headline": "feat: per-mode feedbackMode override",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-09T09:03:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3b1d5a0fadefe205090df7688246a935cae2dbf9",
          "body": "An audit against the shipped code found the README describing 0.1.x\nbehavior. Fixed:\n- Rewrote 'The window bug, and the fix' — it described the old recency-\n  slice algorithm. Now documents the §E evidence-aware fit (classify →\n  priority ladder → compress the path, preserve the payload) and the\n  a\n[…]\nncil'\n  deliberately doesn't fire.\n- Config: documented enabled + disabledForModels (with correct minEffort\n  field and gate direction, verified against config.ts).\n- Prerequisites: added Node 22.19+.",
          "is_bot": false,
          "headline": "docs: bring README current with 0.2.0 (evidence-aware fit, config gaps)",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-09T08:53:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8a99505becb45c19607c65148cd2aa224641bcef",
          "body": "- Auto-publish was keyed on release_created, which release-please leaves\n  EMPTY in manifest mode — only paths_released (JSON array of released\n  paths) is set. That's why 0.2.0 tagged but npm publish silently skipped\n  and needed a manual dispatch. Key on contains(paths_released,\n  'packages/bpx-consult') so it fires on a real release. Next one is hands-off.\n- Bump release-please-action v4 → v5; v5's only breaking change is the\n  node24 runtime, clearing the Node 20 deprecation warning.",
          "is_bot": false,
          "headline": "ci: fix auto-publish trigger + bump release-please to v5 (node24)",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-08T18:55:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fc633a108d25d470bc4066b21a19a5f1888708ef",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release 0.2.0 (#6)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-08T18:47:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e688a9b2949593da6a9fc6e0566e16ca6312b90b",
          "body": "… 20)\n\nCI was red on Node 20 (webidl.util.markAsUncloneable is not a function) —\npi's own packages declare engines node >=22.19.0, so Node 20's bundled\nundici lacks APIs pi-tui needs. Node 20 was testing a runtime pi doesn't\nsupport. Align the matrix to pi's floor + a current release, declare the\nsame engines on bpx-consult so the requirement is explicit not implicit,\nand note Node 22.19+ in the README. Fixes the drift, not just the symptom.",
          "is_bot": false,
          "headline": "ci: test Node 22/24, declare engines >=22.19.0 (drop unsupported Node…",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-08T18:45:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4bd4d19e3309985d144f3bf8cceb6395f5569aa5",
          "body": "Replace the recency-slice fit strategy with a deterministic, evidence-aware\none. Every message is classified by artifact type (evidence.ts, no model\njudgment), the window is filled by priority, and — the load-bearing part —\nthe fit is validated on the FINAL assembled string, not per-bucket sums.\n\n- \n[…]\nofs on the assembled output (oversized directive,\n  many huge messages, giant pinned diff, fail-closed); old drop-count\n  assertions updated to ledger-based reduction checks (fit assertions unchanged)",
          "is_bot": false,
          "headline": "feat: evidence-aware context fit + audit ledger (SPEC §E.0/§E.1)",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-08T11:00:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3e02361fcb9a755abaf37c775b7669bc5d132aaf",
          "body": "Roadmap section for evidence-aware fitting and progressive council,\ngrounded in the Anthropic advisor-tool docs and two Codex design reviews:\n\n- §E.0 evidence ledger — deterministic artifact classification + audit,\n  so 'evidence-aware' never means 'model-judged relevance' (which would\n  reintroduce\n[…]\nd addenda), not context\n  slices. Recovers my-zen's strategic→final staging.\n- §E.4 prompt caching (fragile, measure-gated). §E.5 invariants preserved.\n\nGated behind measuring real fittedTokens first.",
          "is_bot": false,
          "headline": "docs(spec): add §E — context-engine v2 & progressive council",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-08T10:23:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "369441b62a4d16275446b42bdb23767b39458606",
          "body": "Add a mode-selection guideline and a matching description clause so the\nmodel reliably picks the right mode from natural language — and doesn't\nreflexively reach for the expensive one:\n- 'second opinion' / 'sanity check' / 'ask the advisor' → solo\n- 'gut check' / 'smell test' → gut-check\n- 'the coun\n[…]\ne model's own instructions: don't escalate\na casual second-opinion ask to a full council. Kept at the intent level so\nit doesn't duplicate (and drift from) the exact phrase list in\nparseConsultPhrase.",
          "is_bot": false,
          "headline": "docs: map user vocabulary to consult modes in tool guidance",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-07T16:29:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f1995417d0397ecbf8c1436c202ac883dbb91b6a",
          "body": "Review findings on the phrase-trigger path:\n- steer/pipe no longer block the prompt for the whole consult. pi awaits\n  every input handler, so awaiting a council froze the prompt 100s+. Now\n  fire-and-forget: the turn proceeds and the advice steers in when it\n  resolves (unbound signal — the input h\n[…]\non.\n- dropped the bare 'the council' match — it fired on casual mentions and a\n  false positive spends real money. Verb or 'on this' shape now required.\n- runTriggeredConsult reuses extractText (DRY).",
          "is_bot": false,
          "headline": "fix: phrase-trigger blocking, double-consult, and loose council match",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-07T15:40:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "44d9ef935235453b51e6dc53260ca5bacd781aaa",
          "body": "Cost + feature work on bpx-consult, ported from pi-advisor:\n\n- whenStuck now OFF by default (0), matching pi-advisor's posture. Code\n  and default agree (triggers.ts and consult-ui.ts fallbacks → 0).\n- maxConsultsPerTurn (default 3, 0 = unlimited): soft cap on the MODEL's\n  own consult() calls. New \n[…]\n the existing execute* functions (§I re-fit preserved).\n  Gated to interactive/rpc source, enabled + trusted, re-entrancy-guarded.\n- Tests for the matcher, gating, and the turn budget. README updated.",
          "is_bot": false,
          "headline": "feat: wire feedbackMode, add phrase triggers and per-turn consult cap",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-07T15:28:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "668b651c1985b3e1cd91ea3ad1106547753c57ec",
          "body": "…lse)\n\nfeat: now cuts a minor (0.2.0) instead of a patch. bump-minor-pre-major\nstays true so breaking changes still cap at minor while pre-1.0.",
          "is_bot": false,
          "headline": "ci: bump minor for features on 0.x (bump-patch-for-minor-pre-major fa…",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-07T14:50:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7edbd7bf7df741abe20833522e5185b77357267a",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release 0.1.5 (#5)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-07T14:08:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8c1665c6732533c29285ae4efb4776e7b3f154af",
          "body": null,
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main'",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-07T14:04:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c6aa5d47e83272315e239cc80b7960677d3eb677",
          "body": "…without editing a file\n\n/consult shipped as a status read-out that told you to go edit a config file.\nThe error messages even said 'run /consult to pick one' — a lie, since there was\nno picker. This fixes it: /consult is now a two-level interactive menu.\n\nWhat it does:\n- /consult opens a menu of ev\n[…]\n are now honest.\n\n132 tests (was 99): fuzzy subsequence matcher, all menu builders engineered for\nedge cases (empty model list, xhigh gating, no personas, dead model keys,\ncheckmark logic). tsc clean.",
          "is_bot": false,
          "headline": "feat: interactive /consult configurator — set models, mode, triggers …",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-07T14:02:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c91a4666bf16326769ffcf18d16ee2f3de61362a",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release 0.1.4 (#4)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-07T11:48:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d6bf90af03ed5bd516d942040f23277ddfd56519",
          "body": "Stripped every reference to the upstream tools the stance/persona/confidence\npatterns were adapted from — across README, SPEC, and the four source files\n(personas, consensus, debate, council). Technical meaning kept verbatim; only\nthe provenance/attribution was removed. The published package should carry\nnone of these references.\n\nVerified: zero references remain anywhere in the repo (grep sweep clean),\ntsc clean, 99 tests passing.",
          "is_bot": false,
          "headline": "fix: remove external-tool attribution from source and docs",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-07T11:46:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8df93070f1b88ed96b298cb5bada11edd0b63807",
          "body": "…council\n\nThe v2 roadmap item was 'MCP delegation — a council seat calling my-zen's\nconsensus tool.' Wrong shape. Delegating out to an MCP for functionality we\nalready understand well enough to own adds a hop, a runtime dependency, and a\nfailure mode, all for nothing. my-zen was the inspiration for \n[…]\nand context\nbeyond the transcript (files/images).\n\nREADME gets the user-facing version; SPEC §O records the rejected-alternative\nrationale so future-me knows delegation was considered and why it lost.",
          "is_bot": false,
          "headline": "docs(roadmap): drop MCP delegation, commit to native research-backed …",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-07T11:31:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "feb818e03ebcc060e1bd1b3dbc3fbdd4c27b23dd",
          "body": "The old preview was generic tech slop (glowing node on charcoal). New one shows\nwhat the tool actually is: a small coding agent steered by a council of advisors.\nSame live URL, so the gallery picks it up without a republish.",
          "is_bot": false,
          "headline": "chore: replace pi gallery preview with the council illustration",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-07T09:24:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f2e7d05c4b54ba255ec856f9c2c37f259417ba0e",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release 0.1.3 (#3)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-06T11:33:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7d06d93db6ad11b0157d7654d209eff0d4c45b86",
          "body": "The previous commit's 'git add -A' swept in pi native session-state dirs\n(.omx/) that were created wherever sessions ran (repo root, .github/assets/,\npackages/bpx-consult/). These are session UUIDs, temp paths, and logs —\ninternal cruft, no secrets — but they don't belong in a public repo.\n\nUntracke\n[…]\nywhere a session might start. .github/assets/hero.png (legit repo asset)\nis kept. Same delete-going-forward approach as HANDOFF.md: no secrets, so no\nhistory rewrite — provenance and tags stay intact.",
          "is_bot": false,
          "headline": "chore: untrack .omx session state, add to gitignore",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-06T11:32:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "33da3b0d5af2da3e1ab3e42216f4014e43a3126b",
          "body": "TypeBox relies on module-instance identity for its schema registry. The pi\npackages docs list typebox alongside the pi core packages as a peerDependency\nat \"*\", NOT bundled — if pi loads its typebox and our extension ships a second\ncopy, the two registries disagree and schema validation silently bre\n[…]\nsteel-blue/sage)\nconverging on a central luminous node — distinct advisors reaching consensus.\nImage lives in the repo only (raw GitHub URL), kept out of the npm tarball.\n\n99 tests passing, tsc clean.",
          "is_bot": false,
          "headline": "fix(deps): move typebox to peerDependencies; add gallery preview image",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-06T11:29:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c666a966970888334aab4b2596125b5fef78e48f",
          "body": "…NTRIBUTING.md\n\n- drop Repo layout + Releasing sections from README (maintainer-internal)\n- add CONTRIBUTING.md (ground rules, layout, tests, release flow) in voice\n- add Website badge (booplex.com) to the badge row\n- README now matches the template/slopbuster shape: intro -> what's inside -> install -> related",
          "is_bot": false,
          "headline": "docs: slim house README to user-facing, move contributor detail to CO…",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-06T10:41:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ca91482a82c71def9382c27a0a7e2a283f33357c",
          "body": "…methods\n\n- Install: npm, git, local, and pi -e trial loading, plus -l project scope and pi list/config/remove\n- Releasing: rewritten in voice, not a compliance memo",
          "is_bot": false,
          "headline": "docs: house README install + release in Gabi's voice, all pi install …",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-06T09:57:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "145d4b0e997b7a2cb6ca7f78399307a7ccd36245",
          "body": "- bpx-mono README brought to standard: Related cross-links, website interlinks,\n  requirements, install, contributing, badge row, keyword title, real footer line\n- add root MIT LICENSE (badge/footer claimed it; no root file existed)\n- sync Related across house + room (drop stale skill-activator, add pixeltamer)",
          "is_bot": false,
          "headline": "docs: optimize house README + add root LICENSE",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-06T09:44:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c5c290230e540aa8193da4b71ba206341771a3a1",
          "body": "…ult hero\n\n- rich pixeltamer illustrations as heroes/social cards (warm tinkerer's-desk style, on brand)\n- bpx-consult: value-first copy (cheap model works, expensive one steers), private-MCP lineage origin\n- bpx-mono: Booplex pi extensions house branding + value-first index\n- retire the old dark-neon HTML banner/stats cards",
          "is_bot": false,
          "headline": "docs: warm illustrated brand — Booplex pi extensions house + bpx-cons…",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-06T09:32:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "42922c5b6495c567ecce97af977ce8f2f190a63e",
          "body": "…mple, issue/PR templates\n\n- HTML-rendered banner (bug->fix) + social-preview card, brand tokens, pixel-exact\n- badge row: npm version, downloads, provenance-signed, CI, MIT\n- title keyword for discoverability\n- 'What it looks like' section with a real council output (the split verdict)\n- .github issue/PR templates adapted from the boilerplate for bpx-consult",
          "is_bot": false,
          "headline": "docs: give the README a proper front door — banner, badges, usage exa…",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-05T20:49:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4c924836033409481982243ebd2d9a9aeba4b5cf",
          "body": "Session-to-session handoff notes — internal build context (validation table,\nauth-state observations, test setup). Kept locally at ~/bpx-mono-HANDOFF-local.md\nfor reference; no longer tracked. No secrets were ever in this file, so history\nis left intact — provenance attestations on the published npm releases stay valid.",
          "is_bot": false,
          "headline": "chore: remove internal HANDOFF.md from repo",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-05T20:10:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2e0888c5b31750695f04b1c42d9d687dd718c129",
          "body": null,
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main'",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-05T19:57:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e518166b24ec5df48912d9da469e02e4f1785114",
          "body": "The repo root only had HANDOFF.md, so github.com/gabelul/bpx-mono showed a bare\nfile listing. Added a root README that introduces bpx-mono as the monorepo,\nsurfaces @booplex/bpx-consult with a one-paragraph pitch + install command, and\nlinks into packages/bpx-consult/README.md for the full docs. Standard monorepo\npattern (rpiv-mono, pi-extensions both do this). npm still ships the package\nREADME unchanged.",
          "is_bot": false,
          "headline": "docs: add root README so GitHub homepage renders the mono",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-05T19:57:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f96931098ec4976a4075d6a6dbf207a5f829b407",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release 0.1.2 (#2)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-05T19:31:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3e859062c2b7f3938777ed3fdf60c18b40910067",
          "body": null,
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main'",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-05T19:30:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1026af285d6583dffb2fb969a067073294c63688",
          "body": "The CLI smoke tests failed in GitHub Actions (Ubuntu) but passed locally\nbecause the fixtures shipped as 100644, not 100755 — the macOS resource-fork\ncleanup stripped the executable bit during commit. spawn() needs +x to run a\nscript directly; on CI the fixtures couldn't execute.\n\nFix: invoke every \n[…]\none running fixtures directly). This is the kind of CI-\nonly failure local runs structurally can't catch — exactly why the publish job\ngates on tests.\n\n99 tests passing locally; should now pass in CI.",
          "is_bot": false,
          "headline": "fix(test): invoke CLI fixtures via bash so CI doesn't depend on exec bit",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-05T19:29:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "141b47320ee1ef1d47366a8b3ea794a11062b5af",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release 0.1.1 (#1)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-05T19:23:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e4fea8f40799a163981769654959bc9bc35b8fe5",
          "body": "Reviewer finding #5 (was v1.1, promoted). linkController attached an 'abort'\nlistener to the parent signal on every call; withTimeout/linkSignal never\nremoved it. Over a long session, every consult call leaked one orphan listener\non ctx.signal.\n\nFix: linkController returns { ctrl, cleanup }; withTim\n[…]\nrt. debate.ts callStep no longer re-links the signal it's handed (it uses\nthe passed signal directly — the re-link was the leak path that bypassed\nwithTimeout's cleanup).\n\n99 tests passing, tsc clean.",
          "is_bot": false,
          "headline": "fix(timeout): remove AbortSignal listener leak + drop dead linkSignal",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-05T19:22:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "86a2ee074aab39eb91ae9118eda68a97a8769ed8",
          "body": "Two doc-hygiene changes post-first-publish:\n\n- Rewrote the defensive 'What's not in v1' section as a forward-looking Roadmap\n  (v1.1: mixed CLI council + circuit-breaker; v2: MCP delegation, memory\n  compression). Same information, less clutter energy, sets direction instead\n  of apologizing for sco\n[…]\n\n  404 in the npm tarball. SPEC was never in the npm files list anyway.\n\nNot yet republished to npm — these README changes land on the next\nrelease-please run once the trusted publisher is configured.",
          "is_bot": false,
          "headline": "docs(readme): replace 'What's not in v1' with Roadmap + GitHub-only SPEC",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-04T17:20:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a90bcfa057a62ccdd154c4786a985b09f7a69498",
          "body": "Mirrors the screenslop pattern. No NPM_TOKEN needed — uses OIDC trusted\npublishing, which solves the 2FA/token friction we hit trying to publish\nmanually.\n\n- .github/workflows/ci.yml: typecheck + vitest on push/PR, Node 20 + 22 matrix.\n- .github/workflows/release.yml: release-please opens a Release \n[…]\noplex/bpx-consult/access\n  2. Add trusted publisher: owner=gabelul, repo=bpx-mono,\n     workflow=release.yml, environment=npm\nUntil that link is configured, publish 403s (release PR + tag still work).",
          "is_bot": false,
          "headline": "ci: GitHub Actions release pipeline (release-please + OIDC npm publish)",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-04T13:53:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "12a03f225a47ee7ef8b9010cff7eb9e516898051",
          "body": "@gabelul scope doesn't exist on npm — publish failed with 'Scope not found'.\n@booplex is the org already in use (@booplex/stitch-kit ships there). Renaming\nthe package + README + HANDOFF to match. No .npmrc route needed for @booplex\n(it uses the default npmjs.com registry, not GitHub Packages like @gabelul).",
          "is_bot": false,
          "headline": "chore: rename to @booplex/bpx-consult (scope owned, brand-consistent)",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-04T11:41:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "90508f344a2f7d87cca1e2bafc1df6186b8ecfc2",
          "body": null,
          "is_bot": false,
          "headline": "chore: add MIT LICENSE (referenced by package.json files)",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-04T10:29:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7a86406262937f7074065b0ee7967f332e116649",
          "body": "Ran the actual rule files, not vibes. Findings + fixes:\n- Converted the Resilience and feedbackMode sections from bold-header-colon\n  lists (rule 15 pattern) to prose. The items were genuinely distinct so a list\n  wasn't wrong, but the bold-header-colon is an AI tell.\n- Thinned em-dashes: 6 remain (\n[…]\nryday second opinion' filler.\n\nPass 2 audit clean: zero AI-vocab (delve/tapestry/landscape/etc.), zero filler\nphrases, zero hedge-stacking, zero chatbot artifacts. Score holds in human-like\nterritory.",
          "is_bot": false,
          "headline": "docs(readme): slopbuster two-pass audit",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-04T10:12:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d2958c99a661527992bb58c5fa5b0f45fa75d62e",
          "body": "Live default-roster run (3x haiku on Anthropic) surfaced that a weaker\nsynthesizer at low thinking can misread its input — claimed 'I only see one\nadvisor' when all three member replies were present (verified: 985 input\ntokens, 3 replies in the prompt). Not a code bug; the data was correct. But\nthe \n[…]\n proven live: all 3 members fired completeSimple on\nAnthropic, returned ok, concatenated, sent to synth. Provider-collision warning\nfired correctly. §I synth-fit ran. The Anthropic residual is closed.",
          "is_bot": false,
          "headline": "fix(council): tighten synthesizer prompt against multi-section misread",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-03T19:14:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "197fafba338a300da0427e2f499e1e6819a90abc",
          "body": "Publish gate closed: all three default Anthropic model keys verified live\nagainst the registry + auth. claude-haiku-4-5 fired a real reply; opus-4-6 and\nsonnet-4-6 returned 429 (rate-limited, not missing — a 429 means the model\nresolves AND authenticates). Registry resolution confirmed for all three\n[…]\ncumented (was shipped but undocumented): steer/pipe/show +\n  the auto-trigger-always-steers rule.\n\nSPEC link already ./SPEC.md (Claude's fix was in the file). 96 tests, tsc clean.\nPublish-ready as v1.",
          "is_bot": false,
          "headline": "docs(readme): verify default model keys + address review soft notes",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-03T15:41:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b46bdf3e4f4bc6b7b382538796609f3baae7a016",
          "body": "- README.md written against actual shipped v1 scope. Honest about what's NOT\n  in v1 (council CLI routing, circuit-breaker, mixed-council parallel, MCP,\n  memory compression) so the docs don't drift from the code. No 'mix freely /\n  breaker+backoff' phrasing — that drift is what we spent four commit\n[…]\nfig into solo.\n- Residual noted (not fixed): synth-fit single-survivor clamp can truncate\n  member replies under extreme overflow — correct §I-over-completeness behavior.\n\n96 tests passing, tsc clean.",
          "is_bot": false,
          "headline": "docs: README + wire terse cap (review residuals)",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-03T13:47:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "264bac3e1d00ecbd7277908cadbfe45f6fad90f7",
          "body": "…ff is v1.1\n\nMatches shipped code (council.ts): circuit-breaker/backoff was never built;\nv1 resilience is per-member wall-clock timeout + Promise.allSettled isolation.",
          "is_bot": false,
          "headline": "docs: §M council resilience — v1 is timeout+allSettled, breaker/backo…",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-03T11:38:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c79823d2eefa144ff15c81b5371f1b70f2b7e9b5",
          "body": "…il timeout, gut-check\n\nFour issues from the independent review:\n\nMUST-FIX #1 — council synthesizer never window-fitted (§I breach):\n  council.ts handed the synthesizer the raw concatenation of all member replies\n  with no buildConsultContext re-fit. minWindow only fit member INPUT, not synth\n  inpu\n[…]\nr-member circuit-breaker/backoff is v1.1. Comments fixed.\n\nFake CLI fixtures moved into tests/fixtures/cli-bin so the smoke test is\nself-contained (was /tmp, got cleaned). 96 tests passing, tsc clean.",
          "is_bot": false,
          "headline": "fix(bpx-consult): review-driven — synth §I fit, parallel:false, counc…",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-03T11:27:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "22b6fe690dca7554fdb9d78e19ed62a8a3a5e9f9",
          "body": "… solo-only in v1)\n\n- §B: async spawn+stdin rationale (pi 0.80.x ExecOptions has no stdin), don't-revert warning\n- §B: CLI window-fit note (32k fallback when backend not keyed to a registry model)\n- §B/§O: v1 CLI is solo-only; mixed inline+cli council deferred to v1.1 (supersedes 'mix freely')\n- §P/§X/§R/§I: pi.exec -> spawn throughout",
          "is_bot": false,
          "headline": "docs: reconcile SPEC with shipped CLI backend (spawn not pi.exec, CLI…",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-03T10:31:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4caa1e22c2858bfd2f16556d583eca5aec18c094",
          "body": "Closes the build. Two pieces sharing one timeout primitive:\n\nsrc/timeout.ts — withTimeout races an operation against a wall-clock timer\nfiring its own AbortController (linked to parent signal so user-abort still\npropagates). One home for linkSignal, now shared by council (per-member abort),\ndebate (\n[…]\n tests) + cli-backend-smoke.test.ts\n(5 engineered branches via fake CLIs: parse, timeout→clean, exit-nonzero→graceful,\nplain-text, missing→unavailable; + parallelism regression net). 94 total passing.",
          "is_bot": false,
          "headline": "feat(bpx-consult): CLI backend + debate wall-clock timeout (last step)",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-02T23:40:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a0c3173aac00240a09fb61f8b5e9a4c4324cd658",
          "body": "…step\n\nDebate closed and live-validated. Only CLI backend remains, plus the debate\nwall-clock timeout (last unprotected path — consult() is executor-callable so\n'user can Ctrl-C' doesn't cover autonomous debate). Folded into the CLI session:\nsame timeout primitive, same headspace.\n\nHandoff now refle\n[…]\nout/parse/exit-fit/mixed-inline+cli-parallel — the last one justifies the\nexecSync→pi.exec decision), and the debate.timeoutMs design (Promise.race on the\npropagating abort controller, ~180s default).",
          "is_bot": false,
          "headline": "docs: handoff updated — CLI + debate.timeoutMs are the combined last …",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-02T16:33:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4aec7400e9ef1c1e4ae8f40e01a49b94f49a3d67",
          "body": "SPEC §M. Advocate proposes -> critic attacks -> advocate rebuts, N rounds\n(default 2, configurable 1-4), then a synthesizer issues a closing verdict.\nReuses council's stance-injected persona prompts + my-zen challenge.py\n'critically reassess, do not reflexively agree' framing for the attack step.\n\nF\n[…]\ncate's claim), confirming round threading. Verdict\nresolved decisively (STOP) with named critic 'clean hits'. Reuses linkSignal\nfrom council for per-step abort isolation.\n\n78 tests passing, tsc clean.",
          "is_bot": false,
          "headline": "feat(bpx-consult): debate mode — sequential adversarial",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-02T14:41:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d763c1f3bfd8d69a7b4581e831e2a0201e8ff319",
          "body": "Reviewer caught that the triggered path dispatched by defaultMode — meaning a\ncouncil-config session would fire a full 3+ member + synthesis council on every\nauto-trigger. Undocumented accident, not a design call.\n\nDecided solo-only by design: auto-fires are safety nets, not deliberate\nconsultations. Council burns quota surprisingly on a loop/repeated-errors\ntrigger. Council is reserved for explicit invocation (mode:council tool arg,\n/consult council). Documented in SPEC §T.",
          "is_bot": false,
          "headline": "fix(bpx-consult): auto-triggers always run solo (§T documented decision)",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-02T14:02:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9613186fbc7d6928830052ba28334c5796fb8d07",
          "body": "…ion)\n\nSPEC §T. Two auto-triggers wired via pi event handlers:\n- onDone: pi.on('agent_end') → review the turn's work. Off by default.\n- whenStuck:N: pi.on('tool_result') → fire after N consecutive errors OR N\n  identical tool calls (loop detection). Default N=3.\n\nBoth traps the reviewer flagged, bak\n[…]\n error trigger fired on 2 consecutive failed reads, advisor\nreplied, sendUserMessage({deliverAs:'steer'}) injected cleanly — NO deadlock,\nexecutor continued normally, exactly 1 injection (no cascade).",
          "is_bot": false,
          "headline": "feat(bpx-consult): triggers — onDone + whenStuck (loop + error detect…",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-02T00:12:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8be3070c22564b899cfc3bc023ed8fd54ff19cd9",
          "body": "Natural stopping point after council validation. Fresh session picks up at\ntriggers (step 5/7) with: validation table (all green), §I decision, rate-limit\nfix shipped, remaining step order (triggers -> debate -> CLI), pi API facts\nnailed down (trigger events, two gotchas, completeSimple reference), reuse map,\nand the discipline that kept catching real bugs (engineer smoke tests to trip\nthe mocked branches, never happy paths).",
          "is_bot": false,
          "headline": "docs: handoff note for triggers — full state, no re-discovery",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-01T20:41:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "be09a7468474024f710012d16f01f7aa3db3b107",
          "body": "…arning\n\nThe rate-limit defect was a defaults problem, not a code problem. The default\nroster seated all three personas on modes.solo.model (which is also typically\nthe executor's model), so out-of-box councils ran N parallel calls to the same\nfree-tier provider and tripped QPM limits — live testing\n[…]\nce ran on real split (0.83, agreement 0.5),\nsynthesizer surfaced the split honestly and made a call. This was the one\ncouncil mechanism never before seen on real dissent.\n\n69 tests passing, tsc clean.",
          "is_bot": false,
          "headline": "fix(bpx-consult): distinct-tier default roster + provider-collision w…",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-01T17:33:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0bcf2eb54b3bb12a0289f53218a42154da039e9f",
          "body": "Two bugs the engineered live smoke test caught:\n\n1. Project-local config never loaded (SPEC §X breach):\n   loadConfig() only read the global ~/.pi/agent/bpx-consult.json, ignoring\n   project-local .pi/bpx-consult.json. The tool execute site called loadConfig()\n   with NO args (my edit there silently\n[…]\ne-failed, architect (flash) failed\nmid-call (likely rate limit), critic (pro) succeeded — council synthesized on\n1-of-3 with confidence 0.73. Resilience held; no cascade.\n\n69 tests passing, tsc clean.",
          "is_bot": false,
          "headline": "fix(bpx-consult): project-local config + council member resilience",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-01T16:17:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "46ddf3158c94c8a90fefff778daf1e08a35954d1",
          "body": "Three issues Claude's review caught, all invisible to unit tests because they\nmock the call path:\n\n1. maxTokens not enforced (advisor.ts, solo.ts, council.ts):\n   responseReserveTokens reserved INPUT budget but nothing capped the OUTPUT.\n   The reserve was decorative on the response side. Added maxT\n[…]\nindow. §I ('always fits, no exceptions') holds for council.\n   Added tests/council-fit.test.ts guarding the min-window fit (32k and 8k\n   members in mixed-tier councils).\n\n65 tests passing, tsc clean.",
          "is_bot": false,
          "headline": "fix(bpx-consult): review-driven — maxTokens, per-member abort, §I fit",
          "author_name": "Gabi",
          "author_login": null,
          "committed_at": "2026-07-01T09:38:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        }
      ],
      "releases_count": 17,
      "commits_last_year": 109,
      "latest_release_at": "2026-07-17T11:04:22Z",
      "latest_release_tag": "v0.10.1",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 4,
      "days_since_latest_release": 4,
      "mean_days_between_releases": 0.3
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 57,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "@booplex/bpx-consult",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "pi-package",
            "pi-extension",
            "bpx",
            "advisor",
            "council",
            "consensus",
            "multi-model"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@booplex/bpx-consult",
          "is_deprecated": false,
          "latest_version": "0.10.1",
          "repository_url": "https://github.com/gabelul/bpx-mono",
          "versions_count": 17,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 2402,
          "first_published_at": "2026-07-04T17:04:02.501000Z",
          "latest_published_at": "2026-07-17T11:05:02.088000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 4
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 3,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 1
    },
    "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/bpx-consult/tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 43534,
      "source_files_sampled": 46,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "package.json"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "@juicesharp/rpiv-config",
          "manifest": "packages/bpx-consult/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.20.0"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 1,
        "merged_prs": 17,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": null,
      "bot_contributors": 1,
      "top_contributors": [],
      "contributors_sampled": null,
      "top_contributor_share": null
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "release.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json",
        "pnpm-lock.yaml"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 0,
            "reason": "0 out of 7 merged PRs checked by a CI test -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/23 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 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": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "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": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 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": "15 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "34ffc64dabf4d470ac1859b4bf0688577fe689e6",
        "ran_at": "2026-07-22T10:36:25Z",
        "aggregate_score": 2.6,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-21T13:59:37Z",
      "oldest_open_prs": [
        {
          "number": 18,
          "created_at": "2026-07-21T13:59:33Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-07-17T11:04:10Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/gabelul/bpx-mono",
    "host": "github.com",
    "name": "bpx-mono",
    "owner": "gabelul"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 54,
      "inputs": {
        "security": 26,
        "vitality": 74,
        "community": 40,
        "governance": 71,
        "engineering": 49
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 74,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 57,
            "inputs": {
              "commits_last_year": 109,
              "human_commit_share": 0.83,
              "days_since_last_push": 0,
              "active_weeks_last_year": 4
            },
            "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": "4/52 weeks with commits",
                "points": 2.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 4
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "109 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 109
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "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": 17,
              "latest_release_tag": "v0.10.1",
              "releases_from_tags": false,
              "days_since_latest_release": 4,
              "mean_days_between_releases": 0.3
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "17 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 17
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 4 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~0.3 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 0.3
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 40,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 5,
            "inputs": {
              "forks": 0,
              "stars": 3,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "3 stars",
                "points": 4.9,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "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": 70,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 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": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 56,
            "inputs": {
              "packages": [
                "@booplex/bpx-consult"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 2402
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "2,402 downloads/month across npm",
                "points": 45.1,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 2402,
                      "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": "good",
        "name": "Sustainability & Governance",
        "value": 71,
        "weight": 0.24,
        "metrics": [
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 72,
            "inputs": {
              "merged_prs": 17,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "17/17 decided PRs merged",
                "points": 38.2,
                "status": "met",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 17,
                      "decided": 17
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/23 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 47,
            "inputs": {
              "followers": 2,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "gabelul",
              "public_repos": 42,
              "account_age_days": 4358
            },
            "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": "2 followers of gabelul",
                "points": 3.4,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 2,
                      "login": "gabelul"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "42 public repos, account ~11 yr old",
                "points": 23.9,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 42
                    }
                  },
                  {
                    "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": [
                "@booplex/bpx-consult"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 4
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 4 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "17 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 17
                    }
                  }
                ],
                "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": "at_risk",
        "name": "Engineering Quality",
        "value": 49,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "at_risk",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 48,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "0 out of 7 merged PRs checked by a CI test -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "critical",
        "name": "Security",
        "value": 26,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "critical",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 26,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 2.6
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "0 out of 7 merged PRs checked by a CI test -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/23 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "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 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "15 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 52,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.855,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "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": "71 of 83 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 71,
                      "sampled": 83
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "at_risk",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 43,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json",
                "pnpm-lock.yaml"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "packages/bpx-consult/tsconfig.json"
              ],
              "agent_commit_share": 0,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "packages/bpx-consult/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "packages/bpx-consult/tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 43534,
              "source_files_sampled": 46,
              "oversized_source_files": 0
            },
            "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": "0/46 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 46,
                      "oversized": 0
                    }
                  }
                ],
                "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": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "No human contributors found; every contributor is an automation account",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index npm:@booplex/bpx-consult@0.10.1; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-22T10:36:34.878589Z",
  "schema_version": "0.26.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/g/gabelul/bpx-mono.svg",
  "full_name": "gabelul/bpx-mono",
  "license_state": "standard",
  "license_spdx": "MIT"
}

评分是信号,而非担保。 评分反映的是 GitHub 上公开可见的实践——不是代码审计,也不是安全保证。

缺失数据将被剔除并重新归一化权重,绝不按零分计。方法论已版本化并公开:指标 v1.13.0、模式 v0.26.0—— 完整方法论 · 指标知识库.

单项结果在整体记录中的位置: 汇总统计npm.