Public record
Software health reportschema 0.27.0 · metrics 1.13.0 · 2026-07-24 12:23 UTC

wkoverfield / switchboard

A firewall and password manager for your AI coding agents.

TypeScript · JavaScriptMIT★ 0 stars⑂ 0 forkssince Jun 2026View on GitHub ↗

wkoverfield/switchboard holds a health index of 63 out of 100, placing it in the Moderate band. It scores highest on Engineering Quality (86/100) and lowest on Community & Adoption (43/100). It was last updated 5 days ago. A single contributor accounts for most of its recent work.

63
overall / 100
Moderate

Software health index

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

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

Score profile

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

Ownership

Wilson Kiagiri OverfieldPersonal account
12 followers12 public repossince Jan 2023

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

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publishTags
npm@switchboard-mcp/cli0.2.21,927105 days agomcpmodel-context-protocolai-agentscodexclaude-codecursorvscodesupabasestripeposthogsentrymcp-servermcp-routermcp-gatewaytool-callingdeveloper-tools
npm@switchboard-mcp/core0.2.22,002105 days ago
npm@switchboard-mcp/docs-mcp0.2.246635 days ago
npm@switchboard-mcp/mcp-runtime0.2.21,849105 days ago

Metrics by category

Vitality

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

75Good · 22% of overall
How it's scored
36/36Push recency — last push 5 days ago
4.2/36Commit cadence — 6/52 weeks with commits
18/18Commit volume — 240 commits in the last year
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Inputs used
commits_last_year240
human_commit_share0.98
days_since_last_push5
active_weeks_last_year6

Release discipline

100Excellent
How it's scored
27/27Ships releases — 3 releases published
36/36Release recency — latest release 5 days ago
27/27Release cadence — a release every ~2.4 days
0/10OpenSSF Scorecard: Signed-Releases — no data
Inputs used
releases_count3
latest_release_tagv0.2.2
releases_from_tagsno
days_since_latest_release5
mean_days_between_releases2.4
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.

Community & Adoption

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

43At risk · 18% of overall
How it's scored
0/60Stars — 0 stars
0/25Forks — 0 forks
0/15Watchers — 0 watchers
Inputs used
forks0
stars0
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (MIT)
18/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
6.3/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingyes
has_issue_templateno
has_code_of_conductno
has_pull_request_templateyes
How it's scored
50.6/80Monthly downloads — 6,244 downloads/month across npm
0/20Registry dependents — not reported by this ecosystem
Inputs used
packages@switchboard-mcp/cli, @switchboard-mcp/core, @switchboard-mcp/docs-mcp, @switchboard-mcp/mcp-runtime
dependents
ecosystemsnpm
total_downloads
monthly_downloads6,244
Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.

Sustainability & Governance

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

54Moderate · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
0/22.5Commit distribution — top contributor authored 100% of commits
1.4/13.5Contributor breadth — 1 contributors
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Inputs used
bus_factor1
contributors_sampled1
top_contributor_share1
How it's scored
46.8/46.8Issue resolution — 100% of issues closed
37.1/38.3PR acceptance — 192/198 decided PRs merged
0/15OpenSSF Scorecard: Code-Review — Found 0/25 approved changesets -- score normalized to 0
Inputs used
merged_prs192
open_issues0
closed_issues4
issue_closed_ratio1
closed_unmerged_prs6
How it's scored
10/30Ownership backing — personal (user) account
0/20Verified domain — not applicable to user accounts
8/25Owner reach — 12 followers of wkoverfield
15.2/25Track record — 12 public repos, account ~3 yr old
Inputs used
followers12
owner_typeUser
is_verified
owner_loginwkoverfield
public_repos12
account_age_days1,295
Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.
How it's scored
25/25Published & resolvable — 4 package(s) on npm
35/35Publish recency — latest publish 5 days ago
20/20Version history — 10 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packages@switchboard-mcp/cli, @switchboard-mcp/core, @switchboard-mcp/docs-mcp, @switchboard-mcp/mcp-runtime
ecosystemsnpm
any_deprecatedno
min_days_since_publish5

Engineering Quality

Are baseline engineering and documentation practices in place?

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

Documentation

90Excellent
How it's scored
30/30README
25/25Documentation directory
15/15Documentation / homepage site — https://switchboard-beta-nine.vercel.app
10/10Repository description
10/10Topics — 10 topics
0/10Wiki
Inputs used
topicsai-agents, claude-code, cli, codex, coding-agents, developer-tools, local-first, mcp, secrets-management, security
has_wikino
homepagehttps://switchboard-beta-nine.vercel.app
has_readmeyes
has_docs_diryes
has_descriptionyes

Security

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

52Moderate · 16% of overall
How it's scored
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — no data
2.5/2.5CI-Tests — 25 out of 25 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/25 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5License — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — no data
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
5/5Security-Policy — security policy file detected
0/7.5Signed-Releases — no data
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
1.5/7.5Vulnerabilities — 8 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate4.3
Excluded from scoring (no data or not applicable): branch_protection, packaging, signed_releases. Remaining weights renormalized.
How it's scored
35/35Direct dependencies free of known advisories — no direct dependency carries a known advisory
13.2/25Indirect dependencies free of known advisories — 1 affected: @hono/node-server 1.19.14 (moderate 5.9)
40/40No advisories left outstanding — no advisory has been public longer than 90 days
Inputs used
sourceosv
advisories1
affected_packages1
assessed_packages144
unassessed_packages0
affected_by_severitymoderate 1
direct_affected_packages0
Matched the npm:@switchboard-mcp/cli@0.2.2 runtime dependency closure — what installing the published package pulls in — 144 packages. Reachability is not analyzed.

AI Readiness

How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score.

69Moderate · 0% of overall
How it's scored
0/45Agent instructions — no CLAUDE.md / AGENTS.md / editor rules
15/15Machine-readable docs (llms.txt) — llms.txt present
40/40Legible commit history — 92 of 98 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtyes
legible_history_share0.939
agent_instruction_files
agent_instruction_max_bytes
How it's scored
0/18One-command bootstrap
22/22Automated tests
11/11Lint / format config — eslint.config.js
11/11Static type checking — apps/cli/tsconfig.json, packages/core/tsconfig.json, packages/docs-mcp/tsconfig.json, packages/mcp-runtime/tsconfig.json, tsconfig.json
10/10Reproducible environment — lockfile
10/10Demonstrated agent practice — 74 of the last 100 commits agent-authored or agent-credited
8/8Automated maintenance — 2 of the last 100 commits are automated dependency updates
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Inputs used
has_nixno
has_testsyes
lockfilespnpm-lock.yaml
has_dockerfileno
typed_languageyes
bootstrap_files
has_devcontainerno
has_linter_configyes
typecheck_configsapps/cli/tsconfig.json, packages/core/tsconfig.json, packages/docs-mcp/tsconfig.json, packages/mcp-runtime/tsconfig.json, tsconfig.json
agent_commit_share0.74
toolchain_manifests
dependency_bot_commit_share0.02
How it's scored
45/45Type-checkable code — TypeScript (statically typed)
53.6/55Manageable file sizes — 3/122 source files over 60KB
Inputs used
primary_languageTypeScript
largest_source_bytes410,270
source_files_sampled122
oversized_source_files3
How it's scored
0/40API schema (OpenAPI/GraphQL/proto)
20/20MCP server
40/40Runnable examples — examples
Inputs used
example_dirsexamples
has_mcp_signalyes
api_schema_files

Key facts

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

More detail

OpenSSF Scorecard 4.3 / 10
4.3aggregate

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

10Binary-Artifactsno binaries found in the repo
n/aBranch-Protectioninternal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
10CI-Tests25 out of 25 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/25 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
n/aPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
10Security-Policysecurity policy file detected
n/aSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
2Vulnerabilities8 existing vulnerabilities detected
Direct dependencies 11
RegistryPackageVersion constraintManifest
npm@switchboard-mcp/coreworkspace:*apps/cli/package.json
npm@switchboard-mcp/mcp-runtimeworkspace:*apps/cli/package.json
npmcommander^15.0.0apps/cli/package.json
npmcross-keychain^1.1.0packages/core/package.json
npmyaml^2.8.2packages/core/package.json
npmzod^4.2.0packages/core/package.json
npm@modelcontextprotocol/sdk^1.29.0packages/docs-mcp/package.json
npmzod^4.4.3packages/docs-mcp/package.json
npm@switchboard-mcp/coreworkspace:*packages/mcp-runtime/package.json
npm@modelcontextprotocol/sdk^1.29.0packages/mcp-runtime/package.json
npmzod^4.4.3packages/mcp-runtime/package.json
All dependencies 346

Full resolved dependency set from the GitHub dependency graph: 11 direct and 335 indirect (transitive) packages. The transitive closure is complete when the repository commits a lockfile.

RegistryPackageVersionRelation
npm@modelcontextprotocol/sdk1.29.0direct
npm@modelcontextprotocol/sdk^1.29.0direct
npmcommander15.0.0direct
npmcommander^15.0.0direct
npmcross-keychain1.1.0direct
npmcross-keychain^1.1.0direct
npmyaml2.9.0direct
npmyaml^2.8.2direct
npmzod4.4.3direct
npmzod^4.2.0direct
npmzod^4.4.3direct
npm@emnapi/core1.10.0indirect
npm@emnapi/runtime1.10.0indirect
npm@emnapi/wasi-threads1.2.1indirect
npm@esbuild/aix-ppc640.28.1indirect
npm@esbuild/android-arm0.28.1indirect
npm@esbuild/android-arm640.28.1indirect
npm@esbuild/android-x640.28.1indirect
npm@esbuild/darwin-arm640.28.1indirect
npm@esbuild/darwin-x640.28.1indirect
npm@esbuild/freebsd-arm640.28.1indirect
npm@esbuild/freebsd-x640.28.1indirect
npm@esbuild/linux-arm0.28.1indirect
npm@esbuild/linux-arm640.28.1indirect
npm@esbuild/linux-ia320.28.1indirect
npm@esbuild/linux-loong640.28.1indirect
npm@esbuild/linux-mips64el0.28.1indirect
npm@esbuild/linux-ppc640.28.1indirect
npm@esbuild/linux-riscv640.28.1indirect
npm@esbuild/linux-s390x0.28.1indirect
npm@esbuild/linux-x640.28.1indirect
npm@esbuild/netbsd-arm640.28.1indirect
npm@esbuild/netbsd-x640.28.1indirect
npm@esbuild/openbsd-arm640.28.1indirect
npm@esbuild/openbsd-x640.28.1indirect
npm@esbuild/openharmony-arm640.28.1indirect
npm@esbuild/sunos-x640.28.1indirect
npm@esbuild/win32-arm640.28.1indirect
npm@esbuild/win32-ia320.28.1indirect
npm@esbuild/win32-x640.28.1indirect
npm@eslint-community/eslint-utils4.9.1indirect
npm@eslint-community/regexpp4.12.2indirect
npm@eslint/config-array0.21.2indirect
npm@eslint/config-helpers0.4.2indirect
npm@eslint/core0.17.0indirect
npm@eslint/eslintrc3.3.5indirect
npm@eslint/js9.39.4indirect
npm@eslint/object-schema2.1.7indirect
npm@eslint/plugin-kit0.4.1indirect
npm@hono/node-server1.19.14indirect
npm@humanfs/core0.19.2indirect
npm@humanfs/node0.16.8indirect
npm@humanfs/types0.15.0indirect
npm@humanwhocodes/module-importer1.0.1indirect
npm@humanwhocodes/retry0.4.3indirect
npm@inquirer/ansi1.0.2indirect
npm@inquirer/checkbox4.3.2indirect
npm@inquirer/confirm5.1.21indirect
npm@inquirer/core10.3.2indirect
npm@inquirer/editor4.2.23indirect
npm@inquirer/expand4.0.23indirect
npm@inquirer/external-editor1.0.3indirect
npm@inquirer/figures1.0.15indirect
npm@inquirer/input4.3.1indirect
npm@inquirer/number3.0.23indirect
npm@inquirer/password4.0.23indirect
npm@inquirer/prompts7.10.1indirect
npm@inquirer/rawlist4.1.11indirect
npm@inquirer/search3.2.2indirect
npm@inquirer/select4.4.2indirect
npm@inquirer/type3.0.10indirect
npm@jridgewell/sourcemap-codec1.5.5indirect
npm@napi-rs/keyring1.3.0indirect
npm@napi-rs/keyring-darwin-arm641.3.0indirect
npm@napi-rs/keyring-darwin-x641.3.0indirect
npm@napi-rs/keyring-freebsd-x641.3.0indirect
npm@napi-rs/keyring-linux-arm-gnueabihf1.3.0indirect
npm@napi-rs/keyring-linux-arm64-gnu1.3.0indirect
npm@napi-rs/keyring-linux-arm64-musl1.3.0indirect
npm@napi-rs/keyring-linux-riscv64-gnu1.3.0indirect
npm@napi-rs/keyring-linux-x64-gnu1.3.0indirect
npm@napi-rs/keyring-linux-x64-musl1.3.0indirect
npm@napi-rs/keyring-win32-arm64-msvc1.3.0indirect
npm@napi-rs/keyring-win32-ia32-msvc1.3.0indirect
npm@napi-rs/keyring-win32-x64-msvc1.3.0indirect
npm@napi-rs/wasm-runtime1.1.6indirect
npm@oxc-project/types0.133.0indirect
npm@rolldown/binding-android-arm641.0.3indirect
npm@rolldown/binding-darwin-arm641.0.3indirect
npm@rolldown/binding-darwin-x641.0.3indirect
npm@rolldown/binding-freebsd-x641.0.3indirect
npm@rolldown/binding-linux-arm-gnueabihf1.0.3indirect
npm@rolldown/binding-linux-arm64-gnu1.0.3indirect
npm@rolldown/binding-linux-arm64-musl1.0.3indirect
npm@rolldown/binding-linux-ppc64-gnu1.0.3indirect
npm@rolldown/binding-linux-s390x-gnu1.0.3indirect
npm@rolldown/binding-linux-x64-gnu1.0.3indirect
npm@rolldown/binding-linux-x64-musl1.0.3indirect
npm@rolldown/binding-openharmony-arm641.0.3indirect
npm@rolldown/binding-wasm32-wasi1.0.3indirect
npm@rolldown/binding-win32-arm64-msvc1.0.3indirect
npm@rolldown/binding-win32-x64-msvc1.0.3indirect
npm@rolldown/pluginutils1.0.1indirect
npm@standard-schema/spec1.1.0indirect
npm@tybys/wasm-util0.10.3indirect
npm@types/chai5.2.3indirect
npm@types/deep-eql4.0.2indirect
npm@types/estree1.0.9indirect
npm@types/json-schema7.0.15indirect
npm@types/node22.20.0indirect
npm@typescript-eslint/eslint-plugin8.62.1indirect
npm@typescript-eslint/parser8.62.1indirect
npm@typescript-eslint/project-service8.62.1indirect
npm@typescript-eslint/scope-manager8.62.1indirect
npm@typescript-eslint/tsconfig-utils8.62.1indirect
npm@typescript-eslint/type-utils8.62.1indirect
npm@typescript-eslint/types8.62.1indirect
npm@typescript-eslint/typescript-estree8.62.1indirect
npm@typescript-eslint/utils8.62.1indirect
npm@typescript-eslint/visitor-keys8.62.1indirect
npm@vitest/expect4.1.9indirect
npm@vitest/mocker4.1.9indirect
npm@vitest/pretty-format4.1.9indirect
npm@vitest/runner4.1.9indirect
npm@vitest/snapshot4.1.9indirect
npm@vitest/spy4.1.9indirect
npm@vitest/utils4.1.9indirect
npmaccepts2.0.0indirect
npmacorn8.17.0indirect
npmacorn-jsx5.3.2indirect
npmajv6.15.0indirect
npmajv8.20.0indirect
npmajv-formats3.0.1indirect
npmansi-regex5.0.1indirect
npmansi-styles4.3.0indirect
npmargparse2.0.1indirect
npmassertion-error2.0.1indirect
npmbalanced-match1.0.2indirect
npmbalanced-match4.0.4indirect
npmbody-parser2.3.0indirect
npmbrace-expansion1.1.15indirect
npmbrace-expansion5.0.7indirect
npmbytes3.1.2indirect
npmcall-bind-apply-helpers1.0.2indirect
npmcall-bound1.0.4indirect
npmcallsites3.1.0indirect
npmchai6.2.2indirect
npmchalk4.1.2indirect
npmchardet2.2.0indirect
npmcli-width4.1.0indirect
npmcolor-convert2.0.1indirect
npmcolor-name1.1.4indirect
npmconcat-map0.0.1indirect
npmcontent-disposition1.1.0indirect
npmcontent-type1.0.5indirect
npmcontent-type2.0.0indirect
npmconvert-source-map2.0.0indirect
npmcookie0.7.2indirect
npmcookie-signature1.2.2indirect
npmcors2.8.6indirect
npmcross-spawn7.0.6indirect
npmdebug4.4.3indirect
npmdeep-is0.1.4indirect
npmdepd2.0.0indirect
npmdetect-libc2.1.2indirect
npmdunder-proto1.0.1indirect
npmee-first1.1.1indirect
npmemoji-regex8.0.0indirect
npmencodeurl2.0.0indirect
npmes-define-property1.0.1indirect
npmes-errors1.3.0indirect
npmes-module-lexer2.1.0indirect
npmes-object-atoms1.1.2indirect
npmesbuild0.28.1indirect
npmescape-html1.0.3indirect
npmescape-string-regexp4.0.0indirect
npmeslint9.39.4indirect
npmeslint-scope8.4.0indirect
npmeslint-visitor-keys3.4.3indirect
npmeslint-visitor-keys4.2.1indirect
npmeslint-visitor-keys5.0.1indirect
npmespree10.4.0indirect
npmesquery1.7.0indirect
npmesrecurse4.3.0indirect
npmestraverse5.3.0indirect
npmestree-walker3.0.3indirect
npmesutils2.0.3indirect
npmetag1.8.1indirect
npmeventsource3.0.7indirect
npmeventsource-parser3.1.0indirect
npmexpect-type1.3.0indirect
npmexpress5.2.1indirect
npmexpress-rate-limit8.5.2indirect
npmfast-deep-equal3.1.3indirect
npmfast-json-stable-stringify2.1.0indirect
npmfast-levenshtein2.0.6indirect
npmfast-uri3.1.2indirect
npmfdir6.5.0indirect
npmfile-entry-cache8.0.0indirect
npmfinalhandler2.1.1indirect
npmfind-up5.0.0indirect
npmflat-cache4.0.1indirect
npmflatted3.4.2indirect
npmforwarded0.2.0indirect
npmfresh2.0.0indirect
npmfsevents2.3.3indirect
npmfunction-bind1.1.2indirect
npmget-intrinsic1.3.0indirect
npmget-proto1.0.1indirect
npmglob-parent6.0.2indirect
npmglobals14.0.0indirect
npmgopd1.2.0indirect
npmhas-flag4.0.0indirect
npmhas-symbols1.1.0indirect
npmhasown2.0.4indirect
npmhono4.12.26indirect
npmhttp-errors2.0.1indirect
npmiconv-lite0.7.2indirect
npmignore5.3.2indirect
npmignore7.0.5indirect
npmimport-fresh3.3.1indirect
npmimurmurhash0.1.4indirect
npminherits2.0.4indirect
npmip-address10.2.0indirect
npmipaddr.js1.9.1indirect
npmis-extglob2.1.1indirect
npmis-fullwidth-code-point3.0.0indirect
npmis-glob4.0.3indirect
npmis-promise4.0.0indirect
npmisexe2.0.0indirect
npmjose6.2.3indirect
npmjs-yaml4.2.0indirect
npmjson-buffer3.0.1indirect
npmjson-schema-traverse0.4.1indirect
npmjson-schema-traverse1.0.0indirect
npmjson-schema-typed8.0.2indirect
npmjson-stable-stringify-without-jsonify1.0.1indirect
npmkeyv4.5.4indirect
npmlevn0.4.1indirect
npmlightningcss1.32.0indirect
npmlightningcss-android-arm641.32.0indirect
npmlightningcss-darwin-arm641.32.0indirect
npmlightningcss-darwin-x641.32.0indirect
npmlightningcss-freebsd-x641.32.0indirect
npmlightningcss-linux-arm-gnueabihf1.32.0indirect
npmlightningcss-linux-arm64-gnu1.32.0indirect
npmlightningcss-linux-arm64-musl1.32.0indirect
npmlightningcss-linux-x64-gnu1.32.0indirect
npmlightningcss-linux-x64-musl1.32.0indirect
npmlightningcss-win32-arm64-msvc1.32.0indirect
npmlightningcss-win32-x64-msvc1.32.0indirect
npmlocate-path6.0.0indirect
npmlodash.merge4.6.2indirect
npmmagic-string0.30.21indirect
npmmarked15.0.12indirect
npmmarked^15.0.4indirect
npmmath-intrinsics1.1.0indirect
npmmedia-typer1.1.0indirect
npmmeow14.1.0indirect
npmmerge-descriptors2.0.0indirect
npmmime-db1.54.0indirect
npmmime-types3.0.2indirect
npmminimatch10.2.5indirect
npmminimatch3.1.5indirect
npmms2.1.3indirect
npmmute-stream2.0.0indirect
npmnanoid3.3.15indirect
npmnatural-compare1.4.0indirect
npmnegotiator1.0.0indirect
npmobject-assign4.1.1indirect
npmobject-inspect1.13.4indirect
npmobug2.1.3indirect
npmon-finished2.4.1indirect
npmonce1.4.0indirect
npmoptionator0.9.4indirect
npmp-limit3.1.0indirect
npmp-locate5.0.0indirect
npmparent-module1.0.1indirect
npmparseurl1.3.3indirect
npmpath-exists4.0.0indirect
npmpath-key3.1.1indirect
npmpath-to-regexp8.4.2indirect
npmpathe2.0.3indirect
npmpicocolors1.1.1indirect
npmpicomatch4.0.4indirect
npmpicomatch4.0.5indirect
npmpkce-challenge5.0.1indirect
npmpostcss8.5.16indirect
npmprelude-ls1.2.1indirect
npmproxy-addr2.0.7indirect
npmpunycode2.3.1indirect
npmqs6.15.2indirect
npmrange-parser1.2.1indirect
npmraw-body3.0.2indirect
npmrequire-from-string2.0.2indirect
npmresolve-from4.0.0indirect
npmrolldown1.0.3indirect
npmrouter2.2.0indirect
npmsafer-buffer2.1.2indirect
npmsemver7.8.5indirect
npmsend1.2.1indirect
npmserve-static2.2.1indirect
npmsetprototypeof1.2.0indirect
npmshebang-command2.0.0indirect
npmshebang-regex3.0.0indirect
npmside-channel1.1.1indirect
npmside-channel-list1.0.1indirect
npmside-channel-map1.0.1indirect
npmside-channel-weakmap1.0.2indirect
npmsiginfo2.0.0indirect
npmsignal-exit4.1.0indirect
npmsource-map-js1.2.1indirect
npmstackback0.0.2indirect
npmstatuses2.0.2indirect
npmstd-env4.1.0indirect
npmstring-width4.2.3indirect
npmstrip-ansi6.0.1indirect
npmstrip-json-comments3.1.1indirect
npmsupports-color7.2.0indirect
npmtinybench2.9.0indirect
npmtinyexec1.2.4indirect
npmtinyglobby0.2.17indirect
npmtinyrainbow3.1.0indirect
npmtoidentifier1.0.1indirect
npmts-api-utils2.5.0indirect
npmtslib2.8.1indirect
npmtsx4.23.0indirect
npmtsx^4.23.0indirect
npmtype-check0.4.0indirect
npmtype-is2.1.0indirect
npmtypescript5.9.3indirect
npmtypescript-eslint8.62.1indirect
npmundici-types6.21.0indirect
npmunpipe1.0.0indirect
npmuri-js4.4.1indirect
npmvary1.1.2indirect
npmvite8.0.16indirect
npmvitest4.1.9indirect
npmwhich2.0.2indirect
npmwhy-is-node-running2.3.0indirect
npmword-wrap1.2.5indirect
npmwrap-ansi6.2.0indirect
npmwrappy1.0.2indirect
npmyocto-queue0.1.0indirect
npmyoctocolors-cjs2.1.3indirect
npmzod-to-json-schema3.25.2indirect
Dependency advisories 1

Installing npm:@switchboard-mcp/cli@0.2.2 pulls in 144 packages, direct and transitive: 1 carry known advisories, of which 0 are direct dependencies.

PackageVersionRelationSeverityAdvisoriesFixed in
@hono/node-server1.19.14indirectmoderate12.0.5

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

Raw JSON report machine-readable
{
  "data": {
    "repo": {
      "topics": [
        "ai-agents",
        "claude-code",
        "cli",
        "codex",
        "coding-agents",
        "developer-tools",
        "local-first",
        "mcp",
        "secrets-management",
        "security"
      ],
      "is_fork": false,
      "size_kb": 2050,
      "has_wiki": false,
      "homepage": "https://switchboard-beta-nine.vercel.app",
      "languages": {
        "CSS": 22291,
        "HTML": 27950,
        "JavaScript": 285653,
        "TypeScript": 1703751
      },
      "pushed_at": "2026-07-18T23:39:10Z",
      "created_at": "2026-06-18T20:03:53Z",
      "owner_type": "User",
      "updated_at": "2026-07-18T23:39:12Z",
      "description": "A firewall and password manager for your AI coding agents.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript",
        "JavaScript"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Wilson Kiagiri Overfield",
      "type": "User",
      "login": "wkoverfield",
      "company": null,
      "location": null,
      "followers": 12,
      "avatar_url": "https://avatars.githubusercontent.com/u/122052931?v=4",
      "created_at": "2023-01-05T19:49:13Z",
      "is_verified": null,
      "public_repos": 12,
      "account_age_days": 1295
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.2.2",
          "kind": "patch",
          "published_at": "2026-07-18T23:28:56Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-07-17T23:13:37Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-07-14T02:15:35Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "4893b61b14d4ecf76768777d7e4fc4d654afb3bf",
          "body": "The MCP registry caps server.json description at 100 characters; the\nconsolidation copy pushed it to 128. Drop the trailing clause so it matches\nthe npm package descriptions and validates.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Trim the registry description to the 100-character limit (#205)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-18T23:39:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d1e37e1b657aaf40b0125f45930d03d518e72e03",
          "body": "* Release 0.2.2\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n* Publish the spawn attenuation doc to the docs MCP bundle and the site\n\nThe attenuation security doc existed in the repo but was registered in\nneither the docs-mcp bundle manifest nor the site docs manifest, so it\nshipped nowh\n[…]\nts at the file that actually governs, falling back to the\ndefault when unset.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Release 0.2.2 (#202)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-18T21:40:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3dc6b3047c5a4cefaf9bc7ac4ec348337b00bc0a",
          "body": "* Add spawn-time auto-attenuation for Claude Code subagents\n\nGive each subagent spawn its own attenuated child pass automatically, so a\ndelegated worker runs under its own id, its own audit trail, a lease bound to\nthe parent, the inherited seatbelt floor and deny lists, and cascading\nrevocation, whi\n[…]\ntall/status.\nSetup's hooks step inherits the fix through the shared resolver.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add spawn-time auto-attenuation (opt-in, single-level v1) (#201)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-18T21:21:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7df7a8bb28733a705f41de1d95f39c4d6a1555c6",
          "body": "* Resolve each daemon-routed call against the repo its path touches\n\nA user-scoped `switchboard mcp` entry launches with no `--cwd`, so one daemon\nserves a session that may start at `~` and work across several repos. Previously\nevery call resolved config, profiles, and pass against the session's lau\n[…]\nby argument key order (which an agent could use to\nsteer to the weaker repo).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add lazy per-call repo resolution with only-strengthen governance (#200)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-18T20:13:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "93cb7fc32dc1e2f51ddcf280d1510962a30b53d0",
          "body": "* Add the ambient seatbelt: default-on catastrophe denylist with approvable retry\n\nRouted MCP calls are now checked against a small catastrophe denylist on\nevery call: with no pass bound (approvals keyed under a synthetic\n\"seatbelt\" id, 15-minute approval window) and as an un-removable floor\nunder a\n[…]\nases and must-not-trip\nnon-prod redeploy and read-only-inside-subshell cases.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add the ambient seatbelt: default-on catastrophe denylist (#199)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-18T18:18:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "60f3dc83f3a089ec343e307180d55ab6e982465b",
          "body": "Co-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Release 0.2.1 (#198)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-17T21:51:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "afc48a007074bc4f4b8f19b02f1ffbf8537392db",
          "body": "…acked rollback (#197)\n\n* Add machine-level switchboard setup with one-command rollback\n\nswitchboard setup without a preset now sets up the whole machine: scan,\nrepo import (skippable with --skip-import), a value-untouched secrets\nstep that prints the exact secrets set <ref> commands without ever\nre\n[…]\nion claim to project-scope\nclient config and describes the snapshot behavior.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add switchboard setup: one-command machine onboarding with manifest-b…",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-17T21:45:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "685bf89b48906e925caec6e881461ca0006d14a9",
          "body": "… (#194)\n\n* Make install codex --scope user manage ~/.codex/config.toml\n\nswitchboard install codex --scope user previously only printed a codex\nmcp add command. It now manages the user-level Codex config the same way\nproject scope manages .codex/config.toml: dry run prints the exact TOML\nand target \n[…]\nel tests never\nread the real home directory of the machine running the suite.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Manage user-scoped Codex config and surface user-level client servers…",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-16T19:57:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5f27be6ea9f8be49bed9c74af0f8e54a09d1ca8c",
          "body": "…#195)\n\nThe trust model now states the pass model in OAuth token exchange terms\n(issuer, subject, actor, attenuated scope) so the delegation semantics are\nlegible against RFC 8693, and notes why the envelope is a local lease rather\nthan a token. The existing harness-scoped mandates doc is published to the\ndocs site as Concepts > Delegation Model.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: map the pass model to RFC 8693 and publish the delegation doc (…",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-16T19:57:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "446fed9b372dc872a7bf13db72636aa70a92dbae",
          "body": "…ge, and hero copy (#193)\n\nThe registry, npm, and llms descriptions now state that Switchboard is one\nplace for every agent's MCP servers and secrets, and the hero subcopy leads\nwith pulling existing servers into one routed place. The README headline is\nunchanged.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: describe MCP server and secret consolidation in registry, packa…",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-16T19:57:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2ff78bb352fb59ae8594551dea11014975037204",
          "body": "* feat(site): restore team interest intake\n\nConnect the roadmap card to a validated Formspree endpoint and keep submission feedback inline and accessible.\n\nCo-Authored-By: OpenAI Codex <codex@openai.com>\n\n* fix(site): unify GitHub star link\n\nRemove the internal divider and reserved badge spacing so the label and count read as one navigation item.\n\nCo-Authored-By: OpenAI Codex <codex@openai.com>\n\n---------\n\nCo-authored-by: OpenAI Codex <codex@openai.com>",
          "is_bot": false,
          "headline": "Restore the team interest intake (#192)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-15T00:27:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "07b67f482d5724f1128d0503dd5708209e84ea95",
          "body": "* feat(site): smooth docs navigation\n\nKeep the landing and docs navigation visually continuous, add native cross-document transitions, and simplify the product loop playback behavior.\n\nCo-Authored-By: OpenAI Codex <codex@openai.com>\n\n* refactor(site): tune docs navigation motion\n\nDifferentiate occas\n[…]\n\n\nDisplay a compact cached repository star count in the shared landing and docs navigation.\n\nCo-Authored-By: OpenAI Codex <codex@openai.com>\n\n---------\n\nCo-authored-by: OpenAI Codex <codex@openai.com>",
          "is_bot": false,
          "headline": "Smooth docs navigation and simplify the product loop (#191)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-14T23:40:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9f31252e9694f8a677dbd825ffeb925e6af7242f",
          "body": "Unify the public site, generated docs, and local dashboard around one authority-focused interface. Align setup examples with the shipped import and pass flow, expose explicit local state and audit outcomes, and harden the dashboard's loopback boundary.",
          "is_bot": false,
          "headline": "Redesign landing page and local dashboard (#190)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-14T19:59:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ad65f035efe95774144c14edc6b9c6792fa88aea",
          "body": "The repository is public. Planning, strategy, and evaluation documents were\nbeing published alongside the product documentation. Remove them and keep the\nrepo to the code plus the documentation a user or an agent actually needs.\n\nRemoved:\n- AGENTS.md\n- docs/product/{README,roadmap,mandate-strategy,e\n[…]\necurity, reference, providers, use-case,\nand demo docs are unchanged.\n\nAlso ignore .claude/ and .codex/, which hold local client configuration.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Remove internal working documents from the repo (#189)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-14T19:37:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a602360c46d2f29689e8453cc970bbb49ddd0150",
          "body": "* Remove agent prompt hover preview\n\nKeep the setup prompt as a direct copy action without exposing a hover or focus tooltip.\\n\\nCo-Authored-By: OpenAI Codex <codex@openai.com>\n\n* Anchor stat sources to the pointer\n\nFollow the cursor with collision-aware source tooltips and remove redundant source labels from the stat cards.\\n\\nCo-Authored-By: OpenAI Codex <codex@openai.com>",
          "is_bot": false,
          "headline": "Refine landing-page hover interactions (#188)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-14T05:49:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "03b12eec3e94e37587d64cc5ad55b4937dd06397",
          "body": "Resolve symlink-equivalent repository paths consistently during pass lookup and report controlled single-client installations as ready.\\n\\nCo-Authored-By: OpenAI Codex <codex@openai.com>",
          "is_bot": false,
          "headline": "Fix golden-path authority readiness (#187)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-14T05:49:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dbb89cae4a4f483bcee6d7012ed9865fe49fd22c",
          "body": "Set strict local enforcement, ignore generated client routing files, and move the active roadmap slice to blind human validation.\\n\\nCo-Authored-By: OpenAI Codex <codex@openai.com>",
          "is_bot": false,
          "headline": "Close post-release authority gaps (#184)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-14T04:18:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "73f977496044363c30c6363f863be7766b5cff2c",
          "body": "Co-authored-by: OpenAI Codex <codex@openai.com>",
          "is_bot": false,
          "headline": "Prepare Switchboard 0.2.0 (#183)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-14T01:50:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "155ce945402e76d9001994c024bef3f34df39400",
          "body": "Co-authored-by: OpenAI Codex <codex@openai.com>",
          "is_bot": false,
          "headline": "Move stat citations into card popovers (#182)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-14T01:42:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c87f40e5dddc03e12ccbf981eb80b6a899d27c34",
          "body": "The landing page says status tells you which mode you are in, but status did\nnot surface enforcement at all. Add `enforcement` to the status JSON and a\nhuman-readable line (\"Enforcement: strict (no pass means no routing)\" /\n\"Enforcement: default (no pass means configured profiles are served\nungoverned)\"), so a user in strict mode can confirm it and the claim holds.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Report the enforcement mode in switchboard status (#181)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-14T00:36:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bc5b65d40b32e6fdcee387dbda2040451226ccf5",
          "body": "The hash chain proved no in-place edit, insertion, deletion, or reordering\nwithin the retained file, but it could not see a tail-truncation: deleting\nthe last N entries leaves a valid prefix that verify accepted as \"Chain: OK\".\nThat defeats the whole tamper-evidence claim, since the cheapest attack \n[…]\nmoved-marker,\nand loud-fail-open cases. Updates threat model section 10 + accepted risks,\naudit-logs.md, the public roadmap, and the CHANGELOG.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Make the audit log detect tail-truncation and fail loud (#180)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-14T00:30:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f9e08fc86cd9119a1bd18918e5eae89a5f126814",
          "body": "Today, when no pass is bound, the routed paths serve all configured\nprofiles with no tool policy (\"no pass, no policy\"). This adds an opt-in\ndefault-deny so that \"no pass\" can mean \"nothing moves\".\n\nSurface: a top-level `enforcement: strict` key in .switchboard.yaml, and\n`--strict` on `switchboard m\n[…]\nis rejected. Plus a router unit test and config\nschema tests. Updates threat-model 4.3 + accepted risks, the public roadmap,\nand the CHANGELOG.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add opt-in strict mode: no pass, no route (#179)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-13T18:35:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ea4d53af58f9bfd38db14b66c1d08172934fd6d2",
          "body": "# Conflicts:\n#\tCHANGELOG.md",
          "is_bot": false,
          "headline": "Merge branch 'feat/storefront'",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-13T17:28:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "90ed45c07e88dc264e10ce0120c32bd4162b3825",
          "body": "# Conflicts:\n#\tCHANGELOG.md",
          "is_bot": false,
          "headline": "Merge branch 'feat/denial-demo-dashboard'",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-13T17:27:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b83e6737244ec6aa4db85baf058ef063876c6383",
          "body": "# Conflicts:\n#\tCHANGELOG.md",
          "is_bot": false,
          "headline": "Merge branch 'feat/audit-hash-chain'",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-13T17:26:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9042eab746f0189429dae26dbac6759b3deed966",
          "body": "Section 04: fail-open line becomes strict-mode framing (\"run in strict\nmode and no pass means nothing routes\"), and the audit item now claims\ntruncation detection alongside tampering. The threat model and\naudit-logs docs get updated in lockstep by the enforcement work.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Claim strict mode and truncation detection now that both shipped",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-13T17:24:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "83200e280e48e8f181a59cf4dcb5d7a627d055fe",
          "body": "The preview still appears on hover; the label was clutter.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Drop the \"hover to preview\" hint on the prompt pill",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-13T17:15:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2fc62e67c0a2f6261e90684625d2087879fdb8d7",
          "body": "- Section 01 now opens on the visceral risk a security buyer feels\n  (\"Your coding agent acts with your full access\") and lets the stats\n  land as structural backup, instead of leading with the market stat.\n- Cut the redundant first sentence from the topology caption.\n- Removed the top-border divider row above the loop's step columns;\n  no other section uses one.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Lead section 01 with the fear; trim caption and step divider",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-13T17:11:09Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "29f97948dca86fbaf68658945d4231b63aab34dc",
          "body": "ALLOWED and A HUMAN DECIDES sat directly on the green and gated\nstrokes and were hard to read. Nudged ALLOWED up and gave both a\npaper-colored halo so the text clears the line beneath it.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Lift the topology edge labels off their lines",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-13T17:07:13Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0ee51f1516c540afb921e181e602ae5b2111e4fc",
          "body": "The \"Switchboard governs ... Quilt tracks what they did\" line was\nconfusing since Switchboard also tracks (the audit log). Removed it.\nAlso dropped the green \"_\" after the wordmark in the nav (landing and\ndocs); the mark carries the identity.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Drop the Quilt sibling line and the trailing wordmark underscore",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-13T16:59:54Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7cf6217684bba3c7896eda2a494b40cba0c8ae73",
          "body": "The credential detail (chip, barcode, serial, holo strip, field\nlabels, holder row) was too much to scan in a diagram. Card now shows\nonly what matters at a glance: the mark + SWITCHBOARD, the scope it\nallows (github_ci_*), everything else denied, and expires in 4h.\nShorter card, more breathing room, still reads as a real pass.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Simplify the pass card to a one-glance read",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-13T16:56:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "735e5dfcc308a2d3c1840701bbcca68b86330bc6",
          "body": "New logo: a gate glyph (two posts with a credential passing between\nthem) on a green tile - firewall and pass in one mark. It anchors the\nfavicon, the nav wordmark (landing + docs), and the topology's center\ncard.\n\nThe card is now a proper access badge: issuer lockup (mark +\nSWITCHBOARD + AGENT ACCESS PASS), HOLDER/SCOPE/EXPIRES fields, a\nsmartcard chip, a pass serial, and a barcode, instead of reading like\na bare terminal window.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add a real Switchboard mark; rebuild the pass card as a credential",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-13T16:52:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f14958b29e43ba860d9f2bead0a8de1c029f2898",
          "body": "Internal shorthand from the launch plan; \"storefront\" reads like paid\nsoftware. It never appeared on the site itself.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Drop \"storefront\" from the changelog; it's just the landing page",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-13T16:44:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fa8f65232b1a5e760b39a4a2719e9f4b668e10e5",
          "body": "The denial was told three times (hero topology, section 01's\nwith/without panel, and the loop's step 3). Cut the with/without\npanel so section 01 is just the lede, the three stats, and sources.\n\nThe standalone \"control\" card grid mostly restated what the topology\nand pass card already show. Folded i\n[…]\n\non the security section and dropped the section. Renumbered security\n04, for-agents 05, teams 06, and removed the now-dead .vs and .limits\nCSS.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Consolidate the landing page: 7 sections to 6",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-13T16:21:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "87a1efbb8638a3419f91332f8e2d3b856c8d12cc",
          "body": "Teams heading becomes \"Working with a team?\"; llms.txt/llms-full.txt\nsay \"subagents\" instead of \"subagent fleets.\"\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Drop \"fleet\" from public copy; it reads as VC-speak to devs",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-13T16:14:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "aba8847297a78929456abef24a8870bbe1cca6b2",
          "body": "The \"firewall\" half owned the topology, the DENIED stamp, and the\nwith/without panel; the keychain story got three passing mentions\ndespite being half the tagline and the more checkable hook. New\nsection 03 (secrets) makes it a beat: a before/after file transform\n(.mcp.json with a live plaintext tok\n[…]\nnjected at launch, redacted\neverywhere\" so it owns the defense-in-depth technical claim without\nduplicating the new section's keychain headline.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Give the password-manager half its own section",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-13T15:56:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bd8e28d6556b7868573190dd75ebd673c7262a7f",
          "body": "From an external copy review, applied with judgment:\n\n- Topology caption no longer overclaims: \"One pass decides what your\n  agents' tool calls can reach. Denied calls never leave the machine.\"\n- The WITHOUT panel drops the unverifiable \"716 more GitHub tools\" for\n  the sharper, fully defensible \"ev\n[…]\nined from the brief: building --strict this sprint (real\nenforcement work, flagged as a fast-follow) and none of the protected\ncopy was touched.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Copy review pass: fix overclaims, own the fail-open posture, add arc",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-13T02:05:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "821c7d32c51af059f826cfa535f0c6df90a85a7b",
          "body": "The topology's center card now reads as a physical credential: punched\nlanyard slot, inset double ring, HOLDER/SCOPE/EXPIRES label column\n(scope in grant green, expiry in lease yellow), EVERYTHING ELSE DENIED\nmicroline, refined barcode, and a subtle holo security strip.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Craft pass on the pass card",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-13T00:58:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cae5f77d931970ee9629ec8e9ce7a689c17c9dfb",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Drop the waitlist microcopy line",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-13T00:47:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ddc118eff1e9b1f41455a203b094b8139dff8244",
          "body": "None of the comparable landing pages link npm anywhere. GitHub is the\ncanonical link and the two pages cross-reference each other.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Drop npm from the footer; the install command is the npm link",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-13T00:33:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "79c61a5291cf95bfd240d3f2f8618001cf918cf8",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Footer credit down to MIT; the repo carries attribution",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T23:57:22Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a52fc7c1502e84bf04b528af11a768872eb16a9d",
          "body": "Section 06 swaps the raise-your-hand GitHub link for a real email\ncapture: inline form (email + join button in the token system),\nFormspree POST with a honeypot field, AJAX submit that swaps to a\nconfirmation line, and a no-JS fallback that posts to Formspree's\nconfirmation page. Microcopy promises exactly one email.\n\nThe form action carries a YOUR_FORM_ID placeholder with a TODO;\ncreating the Formspree form takes two minutes and one paste.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Capture the team-tier waitlist with an inline Formspree form",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T23:55:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b3a003671d6a068a501b1474d0000fc723c952fe",
          "body": "From a six-site teardown (paperclip.ing, executor.sh, airweave.ai,\nsuperset.sh, manufact.com, boringcomputers.com):\n\n- Section 01 now answers the ecosystem stats with the product: a\n  WITHOUT/WITH panel (token reach vs the DENIED frame), the pattern\n  every comparable site uses instead of leading wi\n[…]\nd/gated/\n  denied audit rows), framed like the credential artifacts. Notably,\n  call tracing is a \"coming soon\" on comparable sites; ours ships.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Market-pattern pass: product proof, capability framing, with/without",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T23:15:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "25144ef4e211ea8069ea7e12319351c140f31d15",
          "body": "Copy pass on the landing page. Gone: \"built to be diligenced,\" \"trust\ntooling that overstates itself is worse than none,\" \"read it before\nyou trust us. Especially then,\" \"we will not claim it before it\nships,\" \"agent-side authority.\" In their place: \"What Switchboard\ndoes not do,\" \"The security work\n[…]\ne the exact same nav as the landing page (same\nwrap, widths, items, GitHub mark). Link positions verified identical\nacross pages via Playwright.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Say it plainly: rewrite abstract copy, unify docs nav with landing",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T22:49:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b1aad6fa00135b8c6b243aa358986f9429920de2",
          "body": "Docs and Roadmap stay text; GitHub becomes the octocat icon top-right\n(the executor/Firecrawl pattern, minus the star count for now). npm\nleaves the nav; it lives in the install command and the footer. Same\ntreatment on the docs shell header.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Nav follows devtool convention: GitHub mark, no npm link",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T22:46:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "759ae476ec437da445193a315198aaa1e2a9f1d0",
          "body": "Toggling humans/agents no longer reflows the hero: both modes occupy\nidentical space (46px control, measured equal container heights). The\nagents side is a \"copy the setup prompt\" pill; the full prompt shows\nin a floating popover on hover or keyboard focus and stays selectable\nwithout JS. Fixed a stacking bug where sibling entrance animations\ncreated contexts that painted the fine print and topology over the\npopover.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Collapse the agent prompt into a pill with a hover preview",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T22:44:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e1e4a095fcaf89ed40d2b90e6282fec3a1c404d9",
          "body": "The topology is now an illustration rather than a schematic. Agent\nand provider chips carry actual logos (simple-icons paths inlined:\nClaude, OpenAI, Cursor, GitHub, Stripe) with soft depth; the center is\nthe pass rendered as a physical credential card (wordmark, pass\nnumber, scope, expiry, barcode \n[…]\ne\" chip, which\nnow wears the DENIED stamp itself.\n\nVerified via Playwright renders (the preview pane's compositor was\ndesyncing on screenshots).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Elevate the hero visual: real brand marks, credential card, motion",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T22:05:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "872a0091ba3c5c276edfb99170182162289143ee",
          "body": "The looping terminal recording fought the paper system and held a\nmostly-dark rectangle above the fold. The diagram already tells the\nallow/gate/deny story in one glance; the DENIED stamp now sits on it,\nand the live demo is a caption link instead of an embed.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Drop the hero GIF; the topology diagram carries the story",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T20:43:41Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "513ba2deefd5d541cd10f2622e020530b90bf84d",
          "body": "The agent side of the hero toggle is now the executor-style money\ninteraction: a prompt card you paste into Claude Code, Codex, or\nCursor that walks the agent through scan, dry-run import, import,\nclient routing, grant, and verify. The prompt carries the brand's\nsecurity posture: the agent must hand\n[…]\n. Escaped the <ref>/<duration> placeholders\nso they survive HTML parsing; verified a real click lands the full\n932-char prompt on the clipboard.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Make \"for agents\" a copyable setup prompt",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T19:40:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "957014b6bb29154a5ef06fb5b3086e86d62901de",
          "body": "- A hero topology diagram (inline SVG on the token system): agents\n  route through the pass; the allowed edge reaches github_ci_*, the\n  gated edge pauses for a human, and the denied edge stops inside\n  Switchboard, with delete_file struck out and never reached. Caption:\n  one pass decides what leav\n[…]\np story into the hero.\n- A closing CTA echoing the headline before the footer.\n\nNew --gate token for approval-gated color, AA-verified on paper.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Adopt three patterns from executor.sh: topology, agent toggle, closer",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T19:24:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "44b8aae77fcf0b1037210a3cded915e70db89c31",
          "body": "The scan/import/keychain detail it carried is restated in the steps\nsection; the sub now reads in one breath.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Tighten the hero subhead to category plus the sharpest claim",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T18:30:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0e87a05adb3972d973d460351aab0c95cd2e15bb",
          "body": "Pages now emit as docs/<slug>/index.html so extension-less URLs\nresolve without a cleanUrls rewrite, and markdown links are resolved\nat build time: repo-relative .md links between docs map to their site\nURLs, anything else in the repo falls back to a GitHub blob link.\nVerified with a crawl over every emitted page: all internal links 200.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Make docs URLs and cross-links work on any static host",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T18:10:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "61f2ce066e7035bed31d07107ef0993b6613b813",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Regenerate the hero GIF with the setup race fixed",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T17:55:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d2371e27ece1f7a9956a15bc713f7930f5ba1d26",
          "body": "The first visible frame captured the setup backlog because Show\nresumed before clear had executed. Sleep inside the Hide block fixes\nthe race.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Settle the hidden setup before capture resumes in the demo tape",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T17:52:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c558f45777d713f3db798968e6e8836e373e60de",
          "body": "From-scratch redesign off a Mobbin pattern pass (Antimetal/Height/\nCursor hero bones, Firecrawl paper-and-hairline framing, Spade stat\ncards) with a design-engineering register: restraint, typography,\nmotion with purpose.\n\nThe system: warm paper and ink (General Sans + IBM Plex Mono, AA\nverified), h\n[…]\nhonoring prefers-reduced-motion; no JS on\nthe page at all. The docs shell mirrors the same tokens so /docs and\nthe landing read as one artifact.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Redesign the landing page and docs shell: credential-paper system",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T17:51:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4eb9ebc475cc3344b7910f15c173c962d2839c81",
          "body": "Both are build outputs (bundle-docs.mjs and site/build.mjs); the\npublished package includes docs-bundle via its files list at pack time.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Ignore generated docs-bundle and site dist",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T17:05:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "41d8d6b40f5baccf973a8960eae19350b459ebe0",
          "body": "…roadmap\n\nsite/ is a static build (one dev dependency, marked): a landing page\nwhose narrative anchors on the July 28, 2026 MCP spec revision and the\n~8.5% OAuth / ~18% scoping adoption gap (cited), a docs site rendered\nfrom the repo's own markdown, and llms.txt copies at the site root.\nThe honesty \n[…]\n/later split.\nOrg model, richer policy engine, enterprise surface, and daemon socket\nhardening are roadmap entries only, deliberately not built.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add the storefront: landing page, docs site, docs MCP server, public …",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T17:05:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5e7afcf5f3ce8d0b7ea1027ca98a6682bed6d16a",
          "body": "Rendered from a local merge with the audit hash-chain branch so the\nclosing frame shows switchboard audit verify reporting Chain: OK.\nAlso strips the MCP error-code prefix from badge detail lines.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Regenerate the hero GIF from the denial-first tape",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T16:51:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "440d0690cc6488988b2757ec9f5f5f99a3a28273",
          "body": "The tape now climaxes on an out-of-scope call getting DENIED through\nthe real MCP front door (demo-agent.mjs is a genuine MCP client), with\nan approval-gated call before it and switchboard audit verify as the\ncloser. The github-ci safety template supplies the real allow/gate/deny\npolicy; the fixture\n[…]\nstream,\npolled from the same local state files the CLI reads. No dependencies;\nall client-side rendering uses textContent, never markup strings.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Re-cut the hero demo around a live denial; add a local dashboard",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T16:44:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b9640ffbb1aa94918395884b29fda2d3500078df",
          "body": "Each JSONL entry now carries prevHash (previous entry's hash, or\n\"genesis\" for the first chained entry) and hash (sha256 over the entry\nJSON without the hash field). Appends serialize through a lockfile next\nto the log, mirroring the mandate store lock, so concurrent daemon and\nCLI writers cannot fo\n[…]\nudit-logs.md,\nincluding what the chain does not detect (tail truncation, whole-file\nrewrite, never-written entries); signing stays out of scope.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Make the audit log tamper-evident with hash chaining and audit verify",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T16:28:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4e3a98abfd93af2a3a4c12cfe58c1f51ad441201",
          "body": "docs/security/threat-model.md covers components, threat actors, what\nenforcement binds (routed MCP + switchboard run) vs what it cannot (raw\nshell, provider CLIs, direct MCP, browser), revocation semantics\nincluding in-flight calls, daemon socket assumptions (no SO_PEERCRED,\nstated plainly), secrets\n[…]\nog threat surface, and an\naccepted-risks list. trust-model.md becomes a short posture summary\npointing at it; README and SECURITY.md link to it.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add STRIDE threat model as the security diligence artifact",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T16:19:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cc0f3cb668419cb8ea66e0474aa15a349a9b70ed",
          "body": "mcp-publisher publish rejected the listing (400) because the npm\npackage lacked the mcpName field the registry validates npm ownership\nwith. Quilt publishes with the same field. Add\n\"mcpName\": \"io.github.wkoverfield/switchboard\" to the cli package and\nbump so it lands on npm; server.json tracks 0.1.6.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Release 0.1.6: add mcpName for the official MCP registry (#173)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-04T21:12:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9847b1b668d63ad705d609eb72accfac25bb04c6",
          "body": "… (#172)\n\nThe official registry rejects descriptions over 100 characters (422 on\nmcp-publisher publish). Trim to a 93-char version so the listing\nvalidates.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Shorten server.json description to satisfy MCP registry (<=100 chars)…",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-04T21:07:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2b7e7cd18ae1a7d8fdc82850696a3519e610e033",
          "body": "The daemon multiplexing shipped in 0.1.4 but its best capability was\ninvisible. Make it discoverable and carry the MCP registry marker to npm:\n\n- install output now tips users toward --scope user (one server for\n  every repo) at the point of use.\n- README gains a short 'One install for every repo' s\n[…]\n\nThis release exists partly to publish the mcp-name marker (added on\nmain after 0.1.4) so the official MCP registry can validate npm\nownership.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Release 0.1.5: surface user-scope install + MCP registry marker (#171)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-04T20:57:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e38a0f5cf91614daabef582e38f1844cc8512a8b",
          "body": "Sets up publishing to the official MCP registry\n(registry.modelcontextprotocol.io) as io.github.wkoverfield/switchboard,\nwhich auto-feeds Glama, PulseMCP, and Smithery. server.json points at\nthe published @switchboard-mcp/cli npm package launched as\n'switchboard mcp' (stdio); the mcp-name markers pr\n[…]\nublish so registry npm-ownership\nvalidation passes; completing the listing is a one-time\n'mcp-publisher login github && mcp-publisher publish'.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add MCP registry server.json + ownership markers (#170)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-04T18:08:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7623fed18cc30f1283d3aec0ff41def9347dc82e",
          "body": "…169)\n\nShips the multi-repo daemon work (per-request cwd multiplexing, live\npass auto-bind by repo/branch, and install --scope user) to npm.\nVersion reads from package.json so --version stays accurate.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Release 0.1.4: daemon multiplexing, auto-bind, user-scoped install (#…",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-04T16:18:50Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d9fe4a0f9fbb8d13ff1d8bca0ed6f7aa22c3c511",
          "body": "Bumps the npm group with 3 updates: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node), [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) and [tsx](https://github.com/privatenumber/tsx).\n\n\nUpdates `@ty\n[…]\ne-type: version-update:semver-minor\n  dependency-group: npm\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Bump the npm group with 3 updates (#165)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-04T16:08:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2d0fe62610305eb22bd1e9940ebb1639ab910dc2",
          "body": "…(#168)\n\nswitchboard install <client> --scope user prints the one-time command\nto register a single Switchboard MCP server (claude mcp add --scope\nuser, or the codex global equivalent). The server runs with no --cwd\nand no --mandate: each agent session launches it in the project dir, so\nit resolves \n[…]\nauto-bind scopes it. Tests cover the --scope user output shape (no\n--cwd, no --mandate) and scope validation. 407 tests, lint, typecheck\ngreen.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add user-scoped install: one trusted server for every repo (Stage 3) …",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-04T16:07:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "47dea3496f15dbb766069568ec4da294fc23c8f2",
          "body": "…167)\n\nMakes grant-per-repo auto-scope any agent, and is the piece a\n--mandate-less user-level install needs. When the daemon serves a\nrequest with no mandateId, it resolves the single active pass for that\nrepo and branch and applies its policy. Exactly-one-match only: zero\nactive passes keeps the p\n[…]\nagent saw only the\nallowed tool (1 of 14); closing the pass returned it to the full\nsurface. New daemon-runtime test covers the auto-bind path.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Auto-bind the live pass by repo/branch when no --mandate (Stage 2) (#…",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-04T15:59:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "293150d72259ff053c385bbbe680546dda3c3d2d",
          "body": "* Multiplex the daemon: one daemon serves many repos (Stage 1)\n\nThe daemon was a per-machine singleton bound to one repo cwd; a second\nrepo collided (\"daemon is running for X; use --runtime-dir\"). That\ncontradicts the core value prop of managing MCP access across all your\nrepos. Root cause was narro\n[…]\nng repo; omitting cwd entirely still keeps the legacy single-repo\nfallback.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Multiplex the daemon: one daemon serves many repos (Stage 1) (#166)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-04T15:50:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f7f34b1b9106203dc6f7c8424a3ddee17b11144d",
          "body": "…(#164)\n\nThe grouped npm PR (#163) bundled a safe tsx bump with TypeScript 5->6,\nESLint 9->10, and @types/node 22->26, so the whole weekly PR failed CI\nand nothing landed. Ignore those specific majors: they are breaking\ntoolchain upgrades that need a dedicated migration, and @types/node\nshould track\n[…]\n Node 22 we run in CI. Routine and minor bumps now flow\nthrough the weekly group green; lift an ignore entry when doing the\nupgrade on purpose.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Defer TS6/ESLint10 majors so the weekly dependabot group stays green …",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-04T06:11:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3f008dc0905de217da0b3e7bd3414cb2bf13a4aa",
          "body": "* Prepare 0.1.3: ship the real README on the npm page\n\nThe published @switchboard-mcp/cli page was showing a 466-byte stub\nwith pre-carve 'mandate' vocabulary, because npm renders the package's\nown apps/cli/README.md, not the repo root README. Replace it with a\nreal package README: the tagline, the \n[…]\n lockstep.\n\n--version now reports 0.1.3; 403 tests, lint, pack smoke green.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Prepare 0.1.3: ship the real README on the npm page (#162)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-04T06:06:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4d71b97bf213689d01feae1b4b2488b5737ea772",
          "body": "- dependabot.yml: one weekly npm group and one weekly actions group\n  (patterns: *), so a small dependency set stops producing one PR per\n  package. Mirrors the quilt config.\n- ci.yml: apply the three action majors dependabot proposed\n  (checkout v7, setup-node v6, pnpm/action-setup v6) in one commit,\n  since all three edit the same file and would otherwise conflict as\n  separate merges. Supersedes PRs #155, #156, #157.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Group dependabot updates (quilt-style) and bump CI actions (#161)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-04T06:04:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7171b2be275a6346fbfa4287e13c4ac90d109dc3",
          "body": "Bumps [commander](https://github.com/tj/commander.js) from 14.0.3 to 15.0.0.\n- [Release notes](https://github.com/tj/commander.js/releases)\n- [Changelog](https://github.com/tj/commander.js/blob/master/CHANGELOG.md)\n- [Commits](https://github.com/tj/commander.js/compare/v14.0.3...v15.0.0)\n\n---\nupdate\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Bump commander from 14.0.3 to 15.0.0 (#159)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-04T05:53:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f214321509e5160a5fad43fcd244a01d41b58830",
          "body": "The highest-leverage launch asset: a 17s VHS-rendered terminal GIF of\nthe grant flow at the top of the README, in full color. An agent can\nreach every tool and token in the repo, then gets put on a scoped,\nexpiring pass; the PASS GRANTED badge is the hero frame.\n\nBuilt with VHS (the same toolchain a\n[…]\nnt so the\nbadge shows the real enforcing happy path. Image uses an absolute raw\nURL so it renders on the npm package page too, not just GitHub.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add hero demo GIF to the README (#160)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-04T05:44:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "53927c6794af79cd72cfd7c5c94271311b4bffd9",
          "body": "…#154)\n\nModeled on the quilt repo's kit, tuned defensive for a security tool\nin alpha:\n\n- CONTRIBUTING.md leads with the load-bearing properties: secrets\n  never surface, copy never overclaims, machine contracts stay stable,\n  pass vocabulary on the human surface, local-first with no telemetry.\n  As\n[…]\nin (checks required, linear\nhistory, no force push or deletion), private vulnerability reporting,\ndependabot alerts and security fixes enabled.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add contribution kit: CONTRIBUTING, SECURITY, templates, dependabot (…",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-04T05:05:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "67ef054449d3d125e2a45b6ea9d7782411095850",
          "body": "PR #151 carved the human CLI surface from \"mandate\" to \"pass\" but the\ndaemon runtime still answered agents in the old vocabulary. Rewrite the\noutgoing tool-result prose (top-level error and mcpError.message) at the\nresponse boundary and point suggested commands at switchboard pass\nrenew/status, foll\n[…]\ners and audit log entries keep the raw core messages,\nand machine contracts (mcpError.code, mandateId fields, the --mandate\nflag) are unchanged.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Carry the pass vocabulary into daemon agent-facing errors (#153)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-04T04:03:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "68cdcd72c5b0ed504476b30c594ee96a1b61384a",
          "body": "* Rewrite README around the pass, modeled on the best CLI READMEs\n\nStudied ripgrep, fzf, bat, atuin, mise, just, direnv, and age, and\nrebuilt the README on the skeleton they share: tagline, badges, real\nterminal proof in the first screenful, install inside the first 15%,\nquickstart with real output,\n[…]\ncan excerpt keeps the route-missing\nlines so it reads as a real transcript.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Rewrite README around the pass, modeled on the best CLI READMEs (#152)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-04T03:47:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "69efb22a06d4744ed0d4558b5a53cd85bcf2c3b7",
          "body": "* Carve human vocabulary from mandate to pass across the CLI\n\nThe cold test's confirmed friction: users understand the grant badge's\n\"pass\" instantly but couldn't decode \"mandate\" — two words for one\nconcept. This unifies the human surface under pass, timed before npm\npublish so the rename never bec\n[…]\nard\nmandate store...\"); both now go through mandateMessageInPassVocabulary.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Carve human vocabulary from mandate to pass across the CLI (#151)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-04T02:03:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ca7a728a179486d756f60290291116aece959f83",
          "body": "* Color the grant badge: green frame, bold denials, yellow expiry\n\nZero-dependency ANSI painting, on only for a real TTY and always off\nunder NO_COLOR / TERM=dumb, so piped and captured output stays byte-\nplain. Frame widths are measured on plain text before painting so\nescape codes can never skew a\n[…]\ny@anthropic.com>\n\n* Clearer failure when the badge bottom rule goes missing\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Color the grant badge: green frame, bold denials, yellow expiry (#150)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-04T00:55:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e9c2d6b0fc9585bab054cbf2d6c64e0c49d25f57",
          "body": "* Show active passes first in status; nudge grant toward install\n\n- switchboard status now answers \"is a pass live right now?\" as its\n  first line, human and JSON (activePasses with id, branch, role,\n  lease, expiry), with human-readable time remaining.\n- switchboard grant now detects whether any ag\n[…]\ntion, not parse success), so a broken repo config can't hide a\n  live pass.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Show active passes first in status; nudge grant toward install (#149)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-04T00:46:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "352ec43ab16f73e56f7c3b42d65b84b051354e21",
          "body": "* Add switchboard grant/revoke: a scoped pass that expires\n\ngrant is the one-verb front door to the mandate machinery: it derives\nsensible defaults (all repo profiles, current branch, an 'agent' role,\na 4h lease), scopes allowed tools to exactly those profiles'\nnamespaces, creates the mandate, and r\n[…]\nex-matching a core error message, removing a cross-package string\n  coupling.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add switchboard grant/revoke: a scoped pass that expires (#148)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-04T00:12:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a1a2bcc4c9356a26743604a60ff3025be2e333d7",
          "body": "* Reframe CLI entry copy from jargon to plain language\n\nA cold-usability test flagged the --help one-liner ('local mandate\nlayer and MCP profile router') as 'jargon that wouldn't land cold.'\nRewrite the top-level description and the front-door command\ndescriptions (scan, import, status, doctor, inst\n[…]\nes with --write.\n- Relax the guard test to the non-brittle jargon assertions.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Reframe CLI entry copy from jargon to plain language (#147)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-03T23:53:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3206ad9ef3e8762c61dfea1a7af0d1bc56f1ba8e",
          "body": "* Make secret-store failures recoverable instead of a dead end\n\nA cold-usability test got 80% through setup, then secrets set threw a\nbare \"Unsupported state or unable to authenticate data\" crypto error\nwith no path forward, and secrets doctor reported the backend healthy\nand looped back to the cras\n[…]\neck can never destroy a\nuser secret that happens to share the probe ref name.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Make secret-store failures recoverable instead of a dead end (#146)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-03T22:34:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5ec7181303ec514ac893d28e7a39d1aa456066b4",
          "body": "* Broaden audit export with mandate, approval, and log evidence\n\nswitchboard audit export gains --include mandates,approvals,logs (or\nall) to append repo-scoped evidence records to the JSONL stream:\nmandate records carry the lease/actor/policy-hash evidence, approval\nrequest records carry gate conte\n[…]\nries with matched vs\nexported counts, and non-positive --log-limit rejection.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Broaden audit export with mandate, approval, and log evidence (#145)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-02T19:51:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d2b33820cacc65bd795f20f133701f6738076694",
          "body": "The repo manifest now includes an additive diff block comparing the\nintended Switchboard client route against active Codex/Claude project\nconfig. Each client reports in-sync, drift, or unknown status with\ntyped findings (missing or stale Switchboard route, unparseable client\nconfig, direct routes, a\n[…]\n the CLI maps\nscan client inspections and configured acceptedRisks.directMcp into it\nand renders a Route drift section in human manifest output.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add manifest route drift diff v0 (#144)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-02T16:03:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3565b76ffb2d1cf8dfd939b39fcfad74e706b8af",
          "body": "* Add mandate lease evidence v0\n\nMandates now record additive authority evidence: an optional --actor\ncreator identity on mandate create/child/renew, an authority source\n(preset, authority-map, parent, or manual), a deterministic sha256\npolicy hash over the granted profile/tool/approval policy, and \n[…]\ns across mandate JSON,\nmcpLaunch policy, workspace lease, and verbose output.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add mandate lease evidence v0 (#143)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-01T22:53:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cf19ac540c9e751fc9ed7aa1d6d957f809eb621c",
          "body": null,
          "is_bot": false,
          "headline": "Add repo authority manifest v0 (#142)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-01T19:44:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e7f311a3e744b7728522830af0cd2d067623ef11",
          "body": null,
          "is_bot": false,
          "headline": "Create mandates from reviewed authority maps (#141)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-01T16:31:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9c1fe031d63c5234e457a7afa20c0fac1ca8c4e1",
          "body": null,
          "is_bot": false,
          "headline": "Deepen repo authority audit v1 (#140)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-01T16:17:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "56f0bbf09716169cee9d962ccdbfd496aea74ae7",
          "body": null,
          "is_bot": false,
          "headline": "Add repo authority audit v0 (#139)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-01T15:36:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4114834aaaa67c4bcd9919fbdea62fecf11857f3",
          "body": null,
          "is_bot": false,
          "headline": "Add authority map fresh-agent eval (#138)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-01T01:16:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "af4f5554ecf2267bf4db2949a72c52195de60d0e",
          "body": null,
          "is_bot": false,
          "headline": "Prepare public alpha license release (#137)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-01T01:02:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ecb7fba9e30d39068fbe313370eb34fc4b734266",
          "body": null,
          "is_bot": false,
          "headline": "Add authority map draft v0 (#136)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-01T00:41:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9cddf74e103e598606ad8941d67498fa70053f52",
          "body": null,
          "is_bot": false,
          "headline": "Add opt-in live provider dogfood harnesses (#135)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-06-30T16:34:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e3423d58f1148514838ff95557680d5c13e19ab8",
          "body": null,
          "is_bot": false,
          "headline": "Add Supabase dev authority proof (#134)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-06-30T07:50:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2a3714cbf91ebd1e40e872fd4f3a5c34c8ef8d51",
          "body": "* test: deepen vercel preview authority proof\n\n* docs: clarify vercel fixture proof scope",
          "is_bot": false,
          "headline": "test: deepen vercel preview authority proof (#133)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-06-30T06:54:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4f5d670a1b54eeaa9707b739dc7513618f15feaa",
          "body": null,
          "is_bot": false,
          "headline": "test: add blind alpha evidence runbook (#132)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-06-30T05:56:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "67833a802823d4b99dd9681d7af7f7dbdcf7e30c",
          "body": null,
          "is_bot": false,
          "headline": "feat: polish mandate approval operator output (#131)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-06-30T04:08:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "61a570101e4fbc3699c9ddbb71c30ac00f3ec95c",
          "body": null,
          "is_bot": false,
          "headline": "test: deepen github ci authority proof (#130)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-06-29T19:29:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 3,
      "commits_last_year": 240,
      "latest_release_at": "2026-07-18T23:28:56Z",
      "latest_release_tag": "v0.2.2",
      "releases_from_tags": false,
      "days_since_last_push": 5,
      "active_weeks_last_year": 6,
      "days_since_latest_release": 5,
      "mean_days_between_releases": 2.4
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 85,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "@switchboard-mcp/cli",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "mcp",
            "model-context-protocol",
            "ai-agents",
            "codex",
            "claude-code",
            "cursor",
            "vscode",
            "supabase",
            "stripe",
            "posthog",
            "sentry",
            "mcp-server",
            "mcp-router",
            "mcp-gateway",
            "tool-calling",
            "developer-tools"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@switchboard-mcp/cli",
          "is_deprecated": false,
          "latest_version": "0.2.2",
          "repository_url": "https://github.com/wkoverfield/switchboard",
          "versions_count": 10,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 1927,
          "first_published_at": "2026-06-27T15:33:39.487000Z",
          "latest_published_at": "2026-07-18T23:24:36.551000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        },
        {
          "name": "@switchboard-mcp/core",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@switchboard-mcp/core",
          "is_deprecated": false,
          "latest_version": "0.2.2",
          "repository_url": "https://github.com/wkoverfield/switchboard",
          "versions_count": 10,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 2002,
          "first_published_at": "2026-06-27T15:33:35.512000Z",
          "latest_published_at": "2026-07-18T23:24:33.279000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        },
        {
          "name": "@switchboard-mcp/docs-mcp",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@switchboard-mcp/docs-mcp",
          "is_deprecated": false,
          "latest_version": "0.2.2",
          "repository_url": "https://github.com/wkoverfield/switchboard",
          "versions_count": 3,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 466,
          "first_published_at": "2026-07-14T02:13:57.396000Z",
          "latest_published_at": "2026-07-18T23:24:38.122000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        },
        {
          "name": "@switchboard-mcp/mcp-runtime",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@switchboard-mcp/mcp-runtime",
          "is_deprecated": false,
          "latest_version": "0.2.2",
          "repository_url": "https://github.com/wkoverfield/switchboard",
          "versions_count": 10,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 1849,
          "first_published_at": "2026-06-27T15:33:37.156000Z",
          "latest_published_at": "2026-07-18T23:24:34.941000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 0,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_stars": 0,
        "collected_at": null
      },
      "open_issues_and_prs": 3
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": true,
      "has_dockerfile": false,
      "has_mcp_signal": true,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "apps/cli/tsconfig.json",
        "packages/core/tsconfig.json",
        "packages/docs-mcp/tsconfig.json",
        "packages/mcp-runtime/tsconfig.json",
        "tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 410270,
      "source_files_sampled": 122,
      "oversized_source_files": 3,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "package.json",
        "site/package.json"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [
          {
            "name": "@hono/node-server",
            "direct": false,
            "version": "1.19.14",
            "severity": "moderate",
            "ecosystem": "npm",
            "cvss_score": 5.9,
            "advisory_ids": [
              "GHSA-frvp-7c67-39w9"
            ],
            "fixed_version": "2.0.5",
            "advisory_count": 1,
            "oldest_advisory_days": 2
          }
        ],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {
          "moderate": 1
        },
        "advisory_count": 1,
        "affected_count": 1,
        "assessed_count": 144,
        "malicious_count": 0,
        "assessed_package": "npm:@switchboard-mcp/cli@0.2.2",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "@switchboard-mcp/core",
          "manifest": "apps/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@switchboard-mcp/mcp-runtime",
          "manifest": "apps/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "commander",
          "manifest": "apps/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^15.0.0"
        },
        {
          "name": "cross-keychain",
          "manifest": "packages/core/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.1.0"
        },
        {
          "name": "yaml",
          "manifest": "packages/core/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.8.2"
        },
        {
          "name": "zod",
          "manifest": "packages/core/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.2.0"
        },
        {
          "name": "@modelcontextprotocol/sdk",
          "manifest": "packages/docs-mcp/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.29.0"
        },
        {
          "name": "zod",
          "manifest": "packages/docs-mcp/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.4.3"
        },
        {
          "name": "@switchboard-mcp/core",
          "manifest": "packages/mcp-runtime/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@modelcontextprotocol/sdk",
          "manifest": "packages/mcp-runtime/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.29.0"
        },
        {
          "name": "zod",
          "manifest": "packages/mcp-runtime/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.4.3"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "@modelcontextprotocol/sdk",
            "direct": true,
            "version": "1.29.0",
            "ecosystem": "npm"
          },
          {
            "name": "@modelcontextprotocol/sdk",
            "direct": true,
            "version": "^1.29.0",
            "ecosystem": "npm"
          },
          {
            "name": "commander",
            "direct": true,
            "version": "15.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "commander",
            "direct": true,
            "version": "^15.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "cross-keychain",
            "direct": true,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "cross-keychain",
            "direct": true,
            "version": "^1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "yaml",
            "direct": true,
            "version": "2.9.0",
            "ecosystem": "npm"
          },
          {
            "name": "yaml",
            "direct": true,
            "version": "^2.8.2",
            "ecosystem": "npm"
          },
          {
            "name": "zod",
            "direct": true,
            "version": "4.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "zod",
            "direct": true,
            "version": "^4.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "zod",
            "direct": true,
            "version": "^4.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "@emnapi/core",
            "direct": false,
            "version": "1.10.0",
            "ecosystem": "npm"
          },
          {
            "name": "@emnapi/runtime",
            "direct": false,
            "version": "1.10.0",
            "ecosystem": "npm"
          },
          {
            "name": "@emnapi/wasi-threads",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/aix-ppc64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/android-arm",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/android-arm64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/android-x64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/darwin-arm64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/darwin-x64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/freebsd-arm64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/freebsd-x64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-arm",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-arm64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-ia32",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-loong64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-mips64el",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-ppc64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-riscv64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-s390x",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-x64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/netbsd-arm64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/netbsd-x64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/openbsd-arm64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/openbsd-x64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/openharmony-arm64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/sunos-x64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/win32-arm64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/win32-ia32",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/win32-x64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint-community/eslint-utils",
            "direct": false,
            "version": "4.9.1",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint-community/regexpp",
            "direct": false,
            "version": "4.12.2",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/config-array",
            "direct": false,
            "version": "0.21.2",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/config-helpers",
            "direct": false,
            "version": "0.4.2",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/core",
            "direct": false,
            "version": "0.17.0",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/eslintrc",
            "direct": false,
            "version": "3.3.5",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/js",
            "direct": false,
            "version": "9.39.4",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/object-schema",
            "direct": false,
            "version": "2.1.7",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/plugin-kit",
            "direct": false,
            "version": "0.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "@hono/node-server",
            "direct": false,
            "version": "1.19.14",
            "ecosystem": "npm"
          },
          {
            "name": "@humanfs/core",
            "direct": false,
            "version": "0.19.2",
            "ecosystem": "npm"
          },
          {
            "name": "@humanfs/node",
            "direct": false,
            "version": "0.16.8",
            "ecosystem": "npm"
          },
          {
            "name": "@humanfs/types",
            "direct": false,
            "version": "0.15.0",
            "ecosystem": "npm"
          },
          {
            "name": "@humanwhocodes/module-importer",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "@humanwhocodes/retry",
            "direct": false,
            "version": "0.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "@inquirer/ansi",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@inquirer/checkbox",
            "direct": false,
            "version": "4.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "@inquirer/confirm",
            "direct": false,
            "version": "5.1.21",
            "ecosystem": "npm"
          },
          {
            "name": "@inquirer/core",
            "direct": false,
            "version": "10.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "@inquirer/editor",
            "direct": false,
            "version": "4.2.23",
            "ecosystem": "npm"
          },
          {
            "name": "@inquirer/expand",
            "direct": false,
            "version": "4.0.23",
            "ecosystem": "npm"
          },
          {
            "name": "@inquirer/external-editor",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@inquirer/figures",
            "direct": false,
            "version": "1.0.15",
            "ecosystem": "npm"
          },
          {
            "name": "@inquirer/input",
            "direct": false,
            "version": "4.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "@inquirer/number",
            "direct": false,
            "version": "3.0.23",
            "ecosystem": "npm"
          },
          {
            "name": "@inquirer/password",
            "direct": false,
            "version": "4.0.23",
            "ecosystem": "npm"
          },
          {
            "name": "@inquirer/prompts",
            "direct": false,
            "version": "7.10.1",
            "ecosystem": "npm"
          },
          {
            "name": "@inquirer/rawlist",
            "direct": false,
            "version": "4.1.11",
            "ecosystem": "npm"
          },
          {
            "name": "@inquirer/search",
            "direct": false,
            "version": "3.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "@inquirer/select",
            "direct": false,
            "version": "4.4.2",
            "ecosystem": "npm"
          },
          {
            "name": "@inquirer/type",
            "direct": false,
            "version": "3.0.10",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/sourcemap-codec",
            "direct": false,
            "version": "1.5.5",
            "ecosystem": "npm"
          },
          {
            "name": "@napi-rs/keyring",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@napi-rs/keyring-darwin-arm64",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@napi-rs/keyring-darwin-x64",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@napi-rs/keyring-freebsd-x64",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@napi-rs/keyring-linux-arm-gnueabihf",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@napi-rs/keyring-linux-arm64-gnu",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@napi-rs/keyring-linux-arm64-musl",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@napi-rs/keyring-linux-riscv64-gnu",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@napi-rs/keyring-linux-x64-gnu",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@napi-rs/keyring-linux-x64-musl",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@napi-rs/keyring-win32-arm64-msvc",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@napi-rs/keyring-win32-ia32-msvc",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@napi-rs/keyring-win32-x64-msvc",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@napi-rs/wasm-runtime",
            "direct": false,
            "version": "1.1.6",
            "ecosystem": "npm"
          },
          {
            "name": "@oxc-project/types",
            "direct": false,
            "version": "0.133.0",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-android-arm64",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-darwin-arm64",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-darwin-x64",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-freebsd-x64",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-linux-arm-gnueabihf",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-linux-arm64-gnu",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-linux-arm64-musl",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-linux-ppc64-gnu",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-linux-s390x-gnu",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-linux-x64-gnu",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-linux-x64-musl",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-openharmony-arm64",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-wasm32-wasi",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-win32-arm64-msvc",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-win32-x64-msvc",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/pluginutils",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "@standard-schema/spec",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "@tybys/wasm-util",
            "direct": false,
            "version": "0.10.3",
            "ecosystem": "npm"
          },
          {
            "name": "@types/chai",
            "direct": false,
            "version": "5.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "@types/deep-eql",
            "direct": false,
            "version": "4.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@types/estree",
            "direct": false,
            "version": "1.0.9",
            "ecosystem": "npm"
          },
          {
            "name": "@types/json-schema",
            "direct": false,
            "version": "7.0.15",
            "ecosystem": "npm"
          },
          {
            "name": "@types/node",
            "direct": false,
            "version": "22.20.0",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript-eslint/eslint-plugin",
            "direct": false,
            "version": "8.62.1",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript-eslint/parser",
            "direct": false,
            "version": "8.62.1",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript-eslint/project-service",
            "direct": false,
            "version": "8.62.1",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript-eslint/scope-manager",
            "direct": false,
            "version": "8.62.1",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript-eslint/tsconfig-utils",
            "direct": false,
            "version": "8.62.1",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript-eslint/type-utils",
            "direct": false,
            "version": "8.62.1",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript-eslint/types",
            "direct": false,
            "version": "8.62.1",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript-eslint/typescript-estree",
            "direct": false,
            "version": "8.62.1",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript-eslint/utils",
            "direct": false,
            "version": "8.62.1",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript-eslint/visitor-keys",
            "direct": false,
            "version": "8.62.1",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/expect",
            "direct": false,
            "version": "4.1.9",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/mocker",
            "direct": false,
            "version": "4.1.9",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/pretty-format",
            "direct": false,
            "version": "4.1.9",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/runner",
            "direct": false,
            "version": "4.1.9",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/snapshot",
            "direct": false,
            "version": "4.1.9",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/spy",
            "direct": false,
            "version": "4.1.9",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/utils",
            "direct": false,
            "version": "4.1.9",
            "ecosystem": "npm"
          },
          {
            "name": "accepts",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "acorn",
            "direct": false,
            "version": "8.17.0",
            "ecosystem": "npm"
          },
          {
            "name": "acorn-jsx",
            "direct": false,
            "version": "5.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "ajv",
            "direct": false,
            "version": "6.15.0",
            "ecosystem": "npm"
          },
          {
            "name": "ajv",
            "direct": false,
            "version": "8.20.0",
            "ecosystem": "npm"
          },
          {
            "name": "ajv-formats",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-regex",
            "direct": false,
            "version": "5.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-styles",
            "direct": false,
            "version": "4.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "argparse",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "assertion-error",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "balanced-match",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "balanced-match",
            "direct": false,
            "version": "4.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "body-parser",
            "direct": false,
            "version": "2.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "brace-expansion",
            "direct": false,
            "version": "1.1.15",
            "ecosystem": "npm"
          },
          {
            "name": "brace-expansion",
            "direct": false,
            "version": "5.0.7",
            "ecosystem": "npm"
          },
          {
            "name": "bytes",
            "direct": false,
            "version": "3.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "call-bind-apply-helpers",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "call-bound",
            "direct": false,
            "version": "1.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "callsites",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "chai",
            "direct": false,
            "version": "6.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "chalk",
            "direct": false,
            "version": "4.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "chardet",
            "direct": false,
            "version": "2.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "cli-width",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "color-convert",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "color-name",
            "direct": false,
            "version": "1.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "concat-map",
            "direct": false,
            "version": "0.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "content-disposition",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "content-type",
            "direct": false,
            "version": "1.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "content-type",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "convert-source-map",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "cookie",
            "direct": false,
            "version": "0.7.2",
            "ecosystem": "npm"
          },
          {
            "name": "cookie-signature",
            "direct": false,
            "version": "1.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "cors",
            "direct": false,
            "version": "2.8.6",
            "ecosystem": "npm"
          },
          {
            "name": "cross-spawn",
            "direct": false,
            "version": "7.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "debug",
            "direct": false,
            "version": "4.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "deep-is",
            "direct": false,
            "version": "0.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "depd",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "detect-libc",
            "direct": false,
            "version": "2.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "dunder-proto",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "ee-first",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "emoji-regex",
            "direct": false,
            "version": "8.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "encodeurl",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "es-define-property",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "es-errors",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "es-module-lexer",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "es-object-atoms",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "esbuild",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "escape-html",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "escape-string-regexp",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "eslint",
            "direct": false,
            "version": "9.39.4",
            "ecosystem": "npm"
          },
          {
            "name": "eslint-scope",
            "direct": false,
            "version": "8.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "eslint-visitor-keys",
            "direct": false,
            "version": "3.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "eslint-visitor-keys",
            "direct": false,
            "version": "4.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "eslint-visitor-keys",
            "direct": false,
            "version": "5.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "espree",
            "direct": false,
            "version": "10.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "esquery",
            "direct": false,
            "version": "1.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "esrecurse",
            "direct": false,
            "version": "4.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "estraverse",
            "direct": false,
            "version": "5.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "estree-walker",
            "direct": false,
            "version": "3.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "esutils",
            "direct": false,
            "version": "2.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "etag",
            "direct": false,
            "version": "1.8.1",
            "ecosystem": "npm"
          },
          {
            "name": "eventsource",
            "direct": false,
            "version": "3.0.7",
            "ecosystem": "npm"
          },
          {
            "name": "eventsource-parser",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "expect-type",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "express",
            "direct": false,
            "version": "5.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "express-rate-limit",
            "direct": false,
            "version": "8.5.2",
            "ecosystem": "npm"
          },
          {
            "name": "fast-deep-equal",
            "direct": false,
            "version": "3.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "fast-json-stable-stringify",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "fast-levenshtein",
            "direct": false,
            "version": "2.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "fast-uri",
            "direct": false,
            "version": "3.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "fdir",
            "direct": false,
            "version": "6.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "file-entry-cache",
            "direct": false,
            "version": "8.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "finalhandler",
            "direct": false,
            "version": "2.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "find-up",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "flat-cache",
            "direct": false,
            "version": "4.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "flatted",
            "direct": false,
            "version": "3.4.2",
            "ecosystem": "npm"
          },
          {
            "name": "forwarded",
            "direct": false,
            "version": "0.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "fresh",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "fsevents",
            "direct": false,
            "version": "2.3.3",
            "ecosystem": "npm"
          },
          {
            "name": "function-bind",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "get-intrinsic",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "get-proto",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "glob-parent",
            "direct": false,
            "version": "6.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "globals",
            "direct": false,
            "version": "14.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "gopd",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "has-flag",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "has-symbols",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "hasown",
            "direct": false,
            "version": "2.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "hono",
            "direct": false,
            "version": "4.12.26",
            "ecosystem": "npm"
          },
          {
            "name": "http-errors",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "iconv-lite",
            "direct": false,
            "version": "0.7.2",
            "ecosystem": "npm"
          },
          {
            "name": "ignore",
            "direct": false,
            "version": "5.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "ignore",
            "direct": false,
            "version": "7.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "import-fresh",
            "direct": false,
            "version": "3.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "imurmurhash",
            "direct": false,
            "version": "0.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "inherits",
            "direct": false,
            "version": "2.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "ip-address",
            "direct": false,
            "version": "10.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "ipaddr.js",
            "direct": false,
            "version": "1.9.1",
            "ecosystem": "npm"
          },
          {
            "name": "is-extglob",
            "direct": false,
            "version": "2.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "is-fullwidth-code-point",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-glob",
            "direct": false,
            "version": "4.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "is-promise",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "isexe",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "jose",
            "direct": false,
            "version": "6.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "js-yaml",
            "direct": false,
            "version": "4.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "json-buffer",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "json-schema-traverse",
            "direct": false,
            "version": "0.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "json-schema-traverse",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "json-schema-typed",
            "direct": false,
            "version": "8.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "json-stable-stringify-without-jsonify",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "keyv",
            "direct": false,
            "version": "4.5.4",
            "ecosystem": "npm"
          },
          {
            "name": "levn",
            "direct": false,
            "version": "0.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-android-arm64",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-darwin-arm64",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-darwin-x64",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-freebsd-x64",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-linux-arm-gnueabihf",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-linux-arm64-gnu",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-linux-arm64-musl",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-linux-x64-gnu",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-linux-x64-musl",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-win32-arm64-msvc",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-win32-x64-msvc",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "locate-path",
            "direct": false,
            "version": "6.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "lodash.merge",
            "direct": false,
            "version": "4.6.2",
            "ecosystem": "npm"
          },
          {
            "name": "magic-string",
            "direct": false,
            "version": "0.30.21",
            "ecosystem": "npm"
          },
          {
            "name": "marked",
            "direct": false,
            "version": "15.0.12",
            "ecosystem": "npm"
          },
          {
            "name": "marked",
            "direct": false,
            "version": "^15.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "math-intrinsics",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "media-typer",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "meow",
            "direct": false,
            "version": "14.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "merge-descriptors",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "mime-db",
            "direct": false,
            "version": "1.54.0",
            "ecosystem": "npm"
          },
          {
            "name": "mime-types",
            "direct": false,
            "version": "3.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "minimatch",
            "direct": false,
            "version": "10.2.5",
            "ecosystem": "npm"
          },
          {
            "name": "minimatch",
            "direct": false,
            "version": "3.1.5",
            "ecosystem": "npm"
          },
          {
            "name": "ms",
            "direct": false,
            "version": "2.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "mute-stream",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "nanoid",
            "direct": false,
            "version": "3.3.15",
            "ecosystem": "npm"
          },
          {
            "name": "natural-compare",
            "direct": false,
            "version": "1.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "negotiator",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "object-assign",
            "direct": false,
            "version": "4.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "object-inspect",
            "direct": false,
            "version": "1.13.4",
            "ecosystem": "npm"
          },
          {
            "name": "obug",
            "direct": false,
            "version": "2.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "on-finished",
            "direct": false,
            "version": "2.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "once",
            "direct": false,
            "version": "1.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "optionator",
            "direct": false,
            "version": "0.9.4",
            "ecosystem": "npm"
          },
          {
            "name": "p-limit",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "p-locate",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "parent-module",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "parseurl",
            "direct": false,
            "version": "1.3.3",
            "ecosystem": "npm"
          },
          {
            "name": "path-exists",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "path-key",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "path-to-regexp",
            "direct": false,
            "version": "8.4.2",
            "ecosystem": "npm"
          },
          {
            "name": "pathe",
            "direct": false,
            "version": "2.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "picocolors",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "picomatch",
            "direct": false,
            "version": "4.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "picomatch",
            "direct": false,
            "version": "4.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "pkce-challenge",
            "direct": false,
            "version": "5.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "postcss",
            "direct": false,
            "version": "8.5.16",
            "ecosystem": "npm"
          },
          {
            "name": "prelude-ls",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "proxy-addr",
            "direct": false,
            "version": "2.0.7",
            "ecosystem": "npm"
          },
          {
            "name": "punycode",
            "direct": false,
            "version": "2.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "qs",
            "direct": false,
            "version": "6.15.2",
            "ecosystem": "npm"
          },
          {
            "name": "range-parser",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "raw-body",
            "direct": false,
            "version": "3.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "require-from-string",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "resolve-from",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "rolldown",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "router",
            "direct": false,
            "version": "2.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "safer-buffer",
            "direct": false,
            "version": "2.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "semver",
            "direct": false,
            "version": "7.8.5",
            "ecosystem": "npm"
          },
          {
            "name": "send",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "serve-static",
            "direct": false,
            "version": "2.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "setprototypeof",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "shebang-command",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "shebang-regex",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "side-channel",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "side-channel-list",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "side-channel-map",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "side-channel-weakmap",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "siginfo",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "signal-exit",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "source-map-js",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "stackback",
            "direct": false,
            "version": "0.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "statuses",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "std-env",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "string-width",
            "direct": false,
            "version": "4.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "strip-ansi",
            "direct": false,
            "version": "6.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "strip-json-comments",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "supports-color",
            "direct": false,
            "version": "7.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "tinybench",
            "direct": false,
            "version": "2.9.0",
            "ecosystem": "npm"
          },
          {
            "name": "tinyexec",
            "direct": false,
            "version": "1.2.4",
            "ecosystem": "npm"
          },
          {
            "name": "tinyglobby",
            "direct": false,
            "version": "0.2.17",
            "ecosystem": "npm"
          },
          {
            "name": "tinyrainbow",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "toidentifier",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "ts-api-utils",
            "direct": false,
            "version": "2.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "tslib",
            "direct": false,
            "version": "2.8.1",
            "ecosystem": "npm"
          },
          {
            "name": "tsx",
            "direct": false,
            "version": "4.23.0",
            "ecosystem": "npm"
          },
          {
            "name": "tsx",
            "direct": false,
            "version": "^4.23.0",
            "ecosystem": "npm"
          },
          {
            "name": "type-check",
            "direct": false,
            "version": "0.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "type-is",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "typescript",
            "direct": false,
            "version": "5.9.3",
            "ecosystem": "npm"
          },
          {
            "name": "typescript-eslint",
            "direct": false,
            "version": "8.62.1",
            "ecosystem": "npm"
          },
          {
            "name": "undici-types",
            "direct": false,
            "version": "6.21.0",
            "ecosystem": "npm"
          },
          {
            "name": "unpipe",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "uri-js",
            "direct": false,
            "version": "4.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "vary",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "vite",
            "direct": false,
            "version": "8.0.16",
            "ecosystem": "npm"
          },
          {
            "name": "vitest",
            "direct": false,
            "version": "4.1.9",
            "ecosystem": "npm"
          },
          {
            "name": "which",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "why-is-node-running",
            "direct": false,
            "version": "2.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "word-wrap",
            "direct": false,
            "version": "1.2.5",
            "ecosystem": "npm"
          },
          {
            "name": "wrap-ansi",
            "direct": false,
            "version": "6.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "wrappy",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "yocto-queue",
            "direct": false,
            "version": "0.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "yoctocolors-cjs",
            "direct": false,
            "version": "2.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "zod-to-json-schema",
            "direct": false,
            "version": "3.25.2",
            "ecosystem": "npm"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 346,
        "direct_count": 11,
        "indirect_count": 335
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 3,
        "merged_prs": 192,
        "open_issues": 0,
        "closed_ratio": 1,
        "closed_issues": 4,
        "closed_unmerged_prs": 6
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "wkoverfield",
          "commits": 238,
          "avatar_url": "https://avatars.githubusercontent.com/u/122052931?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        "eslint.config.js"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "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": null,
            "reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "25 out of 25 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/25 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": 10,
            "reason": "update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 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": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 10,
            "reason": "security policy file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 2,
            "reason": "8 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "4893b61b14d4ecf76768777d7e4fc4d654afb3bf",
        "ran_at": "2026-07-24T12:23:21Z",
        "aggregate_score": 4.3,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": true,
      "has_dependabot_config": true
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-24T04:09:42Z",
      "oldest_open_prs": [
        {
          "number": 196,
          "created_at": "2026-07-16T19:34:35Z",
          "last_comment_at": "2026-07-16T19:34:36Z",
          "last_comment_author": "vercel"
        },
        {
          "number": 203,
          "created_at": "2026-07-18T21:52:43Z",
          "last_comment_at": "2026-07-18T21:52:45Z",
          "last_comment_author": "vercel"
        },
        {
          "number": 204,
          "created_at": "2026-07-18T21:53:48Z",
          "last_comment_at": "2026-07-18T21:53:51Z",
          "last_comment_author": "vercel"
        }
      ],
      "last_merged_pr_at": "2026-07-18T23:39:08Z",
      "ci_last_conclusion": "FAILURE",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/wkoverfield/switchboard",
    "host": "github.com",
    "name": "switchboard",
    "owner": "wkoverfield"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 63,
      "inputs": {
        "security": 52,
        "vitality": 75,
        "community": 43,
        "governance": 54,
        "engineering": 86
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 75,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 58,
            "inputs": {
              "commits_last_year": 240,
              "human_commit_share": 0.98,
              "days_since_last_push": 5,
              "active_weeks_last_year": 6
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "6/52 weeks with commits",
                "points": 4.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "240 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 240
                    }
                  }
                ],
                "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": 3,
              "latest_release_tag": "v0.2.2",
              "releases_from_tags": false,
              "days_since_latest_release": 5,
              "mean_days_between_releases": 2.4
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "3 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~2.4 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 2.4
                    }
                  }
                ],
                "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": 43,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 0,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "0 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "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": 77,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 6.3,
                "status": "met",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "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": 63,
            "inputs": {
              "packages": [
                "@switchboard-mcp/cli",
                "@switchboard-mcp/core",
                "@switchboard-mcp/docs-mcp",
                "@switchboard-mcp/mcp-runtime"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 6244
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "6,244 downloads/month across npm",
                "points": 50.6,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 6244,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 54,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 10,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 84,
            "inputs": {
              "merged_prs": 192,
              "open_issues": 0,
              "closed_issues": 4,
              "issue_closed_ratio": 1,
              "closed_unmerged_prs": 6
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "100% of issues closed",
                "points": 46.8,
                "status": "met",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "192/198 decided PRs merged",
                "points": 37.1,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 192,
                      "decided": 198
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/25 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": 42,
            "inputs": {
              "followers": 12,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "wkoverfield",
              "public_repos": 12,
              "account_age_days": 1295
            },
            "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": "12 followers of wkoverfield",
                "points": 8,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 12,
                      "login": "wkoverfield"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "12 public repos, account ~3 yr old",
                "points": 15.2,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 12
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 3
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "@switchboard-mcp/cli",
                "@switchboard-mcp/core",
                "@switchboard-mcp/docs-mcp",
                "@switchboard-mcp/mcp-runtime"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 5
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "4 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 4,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 5 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "10 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 10
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "excellent",
        "name": "Engineering Quality",
        "value": 86,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 84,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "1 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": "eslint.config.js",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "eslint.config.js"
                    }
                  }
                ],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "25 out of 25 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "topics": [
                "ai-agents",
                "claude-code",
                "cli",
                "codex",
                "coding-agents",
                "developer-tools",
                "local-first",
                "mcp",
                "secrets-management",
                "security"
              ],
              "has_wiki": false,
              "homepage": "https://switchboard-beta-nine.vercel.app",
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://switchboard-beta-nine.vercel.app",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "10 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 10
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 52,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Branch-Protection, Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection",
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 43,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 15,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 3,
              "scorecard_aggregate": 4.3
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "25 out of 25 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/25 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": "update tool detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "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 not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "8 existing vulnerabilities detected",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Matched the npm:@switchboard-mcp/cli@0.2.2 runtime dependency closure — what installing the published package pulls in — 144 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "npm:@switchboard-mcp/cli@0.2.2",
                  "assessed": 144
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 88,
            "inputs": {
              "source": "osv",
              "advisories": 1,
              "affected_packages": 1,
              "assessed_packages": 144,
              "unassessed_packages": 0,
              "affected_by_severity": "moderate 1",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "1 affected: @hono/node-server 1.19.14 (moderate 5.9)",
                "points": 13.2,
                "status": "partial",
                "details": [
                  {
                    "code": "advisories_affected",
                    "params": {
                      "count": 1,
                      "packages": "@hono/node-server 1.19.14 (moderate 5.9)"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory has been public longer than 90 days",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "advisories_none_stale",
                    "params": {
                      "days": 90
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 144,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "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": 69,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "moderate",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "has_llms_txt": true,
              "legible_history_share": 0.939,
              "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": "llms.txt present",
                "points": 15,
                "status": "met",
                "details": [
                  {
                    "code": "llms_txt_present",
                    "params": {}
                  }
                ],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "92 of 98 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 92,
                      "sampled": 98
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 72,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "pnpm-lock.yaml"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "apps/cli/tsconfig.json",
                "packages/core/tsconfig.json",
                "packages/docs-mcp/tsconfig.json",
                "packages/mcp-runtime/tsconfig.json",
                "tsconfig.json"
              ],
              "agent_commit_share": 0.74,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0.02
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": "eslint.config.js",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "eslint.config.js"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "apps/cli/tsconfig.json, packages/core/tsconfig.json, packages/docs-mcp/tsconfig.json, packages/mcp-runtime/tsconfig.json, tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "apps/cli/tsconfig.json, packages/core/tsconfig.json, packages/docs-mcp/tsconfig.json, packages/mcp-runtime/tsconfig.json, tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "74 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 74,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "2 of the last 100 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 2,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 99,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 410270,
              "source_files_sampled": 122,
              "oversized_source_files": 3
            },
            "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": "3/122 source files over 60KB",
                "points": 53.6,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 122,
                      "oversized": 3
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "moderate",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": true,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [],
  "report_type": "repository",
  "generated_at": "2026-07-24T12:23:36.791019Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/w/wkoverfield/switchboard.svg",
  "full_name": "wkoverfield/switchboard",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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