原始 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"
}