Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-24 12:23 UTC

wkoverfield / switchboard

A firewall and password manager for your AI coding agents.

TypeScript · JavaScriptMIT★ 0 estrellas⑂ 0 forksdesde jun 2026Ver en GitHub ↗

wkoverfield/switchboard tiene un índice de salud de 63 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Engineering Quality (86/100) y la más baja, Community & Adoption (43/100). Se actualizó por última vez hace 5 días. Una sola persona concentra la mayor parte del trabajo reciente.

63
global / 100
Moderado

Índice de salud del software

Las métricas se agrupan en categorías ponderadas sobre una escala de 1 a 100. El resultado global parte de su media; cuando la evidencia pública activa la Política de Jurisdicciones de Alto Riesgo, la calificación se ajusta y recibe el límite 49 (En riesgo). Preparación para IA queda fuera.

63
Excelente85-100Ejemplar; cumple prácticamente todos los criterios evaluados
Bueno70-84Saludable; carencias menores
Moderado50-69Aceptable con carencias notables; se recomienda revisión
En riesgo30-49Debilidades significativas; su adopción exige cautela
Crítico1-29Problemas graves (proyecto abandonado, un solo mantenedor, sin higiene)
VitalidadComunidad yAdopciónSostenibilidady GobernanzaCalidad deIngenieríaSeguridadPreparaciónpara IA

Perfil de puntuación

Cada eje es una categoría. La forma importa más que la media: un proyecto sano llena toda la figura, mientras que un perfil de picos y cráteres indica que la fortaleza en una dimensión enmascara el riesgo en otra.

Titularidad

12 seguidores12 repositorios públicosdesde ene 2023

Este repositorio pertenece a una cuenta personal. Un proyecto con un único propietario conlleva más riesgo de continuidad que uno respaldado por una organización.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicaciónEtiquetas
npm@switchboard-mcp/cli0.2.2192710hace 5 díasmcpmodel-context-protocolai-agentscodexclaude-codecursorvscodesupabasestripeposthogsentrymcp-servermcp-routermcp-gatewaytool-callingdeveloper-tools
npm@switchboard-mcp/core0.2.2200210hace 5 días
npm@switchboard-mcp/docs-mcp0.2.24663hace 5 días
npm@switchboard-mcp/mcp-runtime0.2.2184910hace 5 días

Métricas por categoría

Vitalidad

¿Está vivo el proyecto: se escribe código y se publican versiones?

75Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 5 días
4.2/36Cadencia de commits — 6/52 semanas con commits
18/18Volumen de commits — 240 commits en el último año
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Datos de entrada utilizados
commits_last_year240
human_commit_share0,98
days_since_last_push5
active_weeks_last_year6
Cómo se puntúa
27/27Publica versiones — 3 versiones publicadas
36/36Recencia de las versiones — última versión hace 5 días
27/27Cadencia de publicación — una versión cada ~2,4 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count3
latest_release_tagv0.2.2
releases_from_tagsno
days_since_latest_release5
mean_days_between_releases2,4
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

¿Tiene el proyecto usuarios, descargas, atención y unas condiciones acogedoras para quienes contribuyen?

43En riesgo · 18% del índice global
Cómo se puntúa
0/60Estrellas — 0 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars0
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (MIT)
18/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
6.3/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributing
has_issue_templateno
has_code_of_conductno
has_pull_request_template
Cómo se puntúa
50.6/80Descargas mensuales — 6244 descargas/mes en npm
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packages@switchboard-mcp/cli, @switchboard-mcp/core, @switchboard-mcp/docs-mcp, @switchboard-mcp/mcp-runtime
dependents
ecosystemsnpm
total_downloads
monthly_downloads6244
Excluidos de la puntuación (sin datos o no aplicable): Dependientes en el registro. Los pesos restantes se han renormalizado.

Sostenibilidad y Gobernanza

¿Sobrevivirá el proyecto a sus personas: factor bus, capacidad de respuesta, quién lo respalda y mantenimiento del paquete?

54Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0/22.5Distribución de commits — el principal contribuyente firma el 100% de los commits
1.4/13.5Amplitud de contribuyentes — 1 contribuyentes
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
46.8/46.8Resolución de issues — 100% de issues cerradas
37.1/38.3Aceptación de PR — 192/198 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/25 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs192
open_issues0
closed_issues4
issue_closed_ratio1
closed_unmerged_prs6
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
8/25Alcance del propietario — 12 seguidores de wkoverfield
15.2/25Trayectoria — 12 repos públicos, cuenta de ~3 años
Datos de entrada utilizados
followers12
owner_typeUser
is_verified
owner_loginwkoverfield
public_repos12
account_age_days1295
Excluidos de la puntuación (sin datos o no aplicable): Dominio verificado. Los pesos restantes se han renormalizado.
Cómo se puntúa
25/25Publicado y resoluble — 4 paquete(s) en npm
35/35Recencia de publicación — última publicación hace 5 días
20/20Historial de versiones — 10 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packages@switchboard-mcp/cli, @switchboard-mcp/core, @switchboard-mcp/docs-mcp, @switchboard-mcp/mcp-runtime
ecosystemsnpm
any_deprecatedno
min_days_since_publish5

Calidad de Ingeniería

¿Existen unas prácticas mínimas de ingeniería y documentación?

86Excelente · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 1 flujo(s) de trabajo
24/24Pruebas presentes
16/16Configuración de linter — eslint.config.js
0/9.6Hooks de pre-commit
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 25 out of 25 merged PRs checked by a CI test -- score normalized to 10
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_config
has_precommit_configno

Documentación

90Excelente
Cómo se puntúa
30/30README
25/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — https://switchboard-beta-nine.vercel.app
10/10Descripción del repositorio
10/10Topics — 10 topics
0/10Wiki
Datos de entrada utilizados
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_readme
has_docs_dir
has_description

Seguridad

¿Son sólidas las prácticas visibles de seguridad y de cadena de suministro, sin exposición jurisdiccional de alto riesgo sin resolver?

52Moderado · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — sin datos
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.5Licencia — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — sin datos
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 — sin datos
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
1.5/7.5Vulnerabilities — 8 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate4,3
Excluidos de la puntuación (sin datos o no aplicable): branch_protection, packaging, signed_releases. Los pesos restantes se han renormalizado.
Cómo se puntúa
35/35Dependencias directas libres de avisos conocidos — ninguna dependencia directa tiene un aviso conocido
13.2/25Dependencias indirectas libres de avisos conocidos — 1 afectados: @hono/node-server 1.19.14 (moderate 5.9)
40/40Sin avisos pendientes — ningún aviso lleva público más de 90 días
Datos de entrada utilizados
sourceosv
advisories1
affected_packages1
assessed_packages144
unassessed_packages0
affected_by_severitymoderate 1
direct_affected_packages0
Se cotejó el cierre de dependencias en tiempo de ejecución de npm:@switchboard-mcp/cli@0.2.2 —lo que arrastra la instalación del paquete publicado—: 144 paquetes. No se analiza la alcanzabilidad.

Preparación para IA

¿Hasta qué punto está el repositorio preparado para desarrollarse y mantenerse con agentes de codificación de IA? Es una insignia independiente y experimental — peso 0,0, de modo que se presenta por separado y no afecta a la puntuación de salud global.

69Moderado · 0% del índice global
Cómo se puntúa
0/45Instrucciones para agentes — sin CLAUDE.md / AGENTS.md / reglas de editor
15/15Documentación legible por máquinas (llms.txt) — llms.txt presente
40/40Historial de commits legible — 92 de 98 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txt
legible_history_share0,939
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
0/18Arranque con un solo comando
22/22Pruebas automatizadas
11/11Configuración de lint / formato — eslint.config.js
11/11Verificación estática de tipos — apps/cli/tsconfig.json, packages/core/tsconfig.json, packages/docs-mcp/tsconfig.json, packages/mcp-runtime/tsconfig.json, tsconfig.json
10/10Entorno reproducible — lockfile
10/10Práctica demostrada con agentes — 74 de los últimos 100 commits con autoría o crédito de agente
8/8Mantenimiento automatizado — 2 de los últimos 100 commits son actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfilespnpm-lock.yaml
has_dockerfileno
typed_language
bootstrap_files
has_devcontainerno
has_linter_config
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
Cómo se puntúa
45/45Código verificable por tipos — TypeScript (tipado estático)
53.6/55Tamaños de archivo manejables — 3/122 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageTypeScript
largest_source_bytes410.270
source_files_sampled122
oversized_source_files3
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
20/20Servidor MCP
40/40Ejemplos ejecutables — examples
Datos de entrada utilizados
example_dirsexamples
has_mcp_signal
api_schema_files

Datos clave

0estrellas de GitHub
1contribuidores
240commits en los últimos 12 meses
5días desde el último push
3versiones publicadas
1factor bus
0issues abiertas
npmecosistemas de paquetes

Más detalle

OpenSSF Scorecard 4.3 / 10
4.3agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).Scorecard v5.5.0 · 2026-07-24 12:23 UTC

10Binary-Artifactsno binaries found in the repo
n/dBranch-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/dPackagingpackaging 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/dSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
2Vulnerabilities8 existing vulnerabilities detected
Dependencias directas 11
RegistroPaqueteRestricción de versiónManifiesto
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
Todas las dependencias 346

Conjunto completo de dependencias resueltas según el grafo de dependencias de GitHub: 11 paquetes directos y 335 indirectos (transitivos). El cierre transitivo es completo cuando el repositorio incluye un lockfile.

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

Instalar npm:@switchboard-mcp/cli@0.2.2 arrastra 144 paquetes, directos y transitivos: 1 tienen avisos conocidos, de los cuales 0 son dependencias directas.

PaqueteVersiónRelaciónGravedadAvisosCorregido en
@hono/node-server1.19.14indirectamoderada12.0.5

Un aviso significa que la versión registrada en el grafo de dependencias cae dentro del rango afectado de un aviso. No se analiza la alcanzabilidad, y el grafo incluye fijaciones de desarrollo y prueba: un hallazgo puede referirse al utillaje y no al software distribuido.

Informe JSON sin procesar legible por máquina
{
  "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"
}

Las puntuaciones son señales, no garantías. Reflejan prácticas públicamente visibles en GitHub; no son una auditoría de código ni una garantía de seguridad.

Los datos ausentes se excluyen y los pesos se renormalizan; nunca se puntúan como cero. La metodología es versionada y abierta: métricas v1.13.0, esquema v0.27.0 — metodología completa · wiki de métricas.

Cómo se sitúa un resultado dentro del registro general: estadísticas agregadasnpm.