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

chipallen2 / snazi

No messages for you. A communication gating layer for AI agents to prevent prompt injection.

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

chipallen2/snazi tiene un índice de salud de 48 sobre 100, lo que lo sitúa en la banda En riesgo. Su puntuación más alta es Vitality (73/100) y la más baja, Security (27/100). Se actualizó por última vez hace 5 días. Una sola persona concentra la mayor parte del trabajo reciente.

48
global / 100
En riesgo

Í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.

48
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

Chip AllenCuenta personal
3 seguidores8 repositorios públicosdesde jul 2013

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@chipallen2/snazi0.6.5372820hace 5 díasimessagecliai-agentprompt-injectiongatemacos

Métricas por categoría

Vitalidad

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

73Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 5 días
2.8/36Cadencia de commits — 4/52 semanas con commits
16.1/18Volumen de commits — 61 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_year61
human_commit_share1
days_since_last_push5
active_weeks_last_year4
Cómo se puntúa
27/27Publica versiones — 19 versiones publicadas
36/36Recencia de las versiones — última versión hace 5 días
27/27Cadencia de publicación — una versión cada ~1,7 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count19
latest_release_tagv0.6.5
releases_from_tagsno
days_since_latest_release5
mean_days_between_releases1,7
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?

34En riesgo · 18% del índice global
Cómo se puntúa
4.9/60Estrellas — 3 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars3
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)
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
Cómo se puntúa
47.6/80Descargas mensuales — 3728 descargas/mes en npm
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packages@chipallen2/snazi
dependents
ecosystemsnpm
total_downloads
monthly_downloads3728
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?

36En riesgo · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
7/22.5Distribución de commits — el principal contribuyente firma el 69% de los commits
2.7/13.5Amplitud de contribuyentes — 2 contribuyentes
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Datos de entrada utilizados
bus_factor1
contributors_sampled2
top_contributor_share0,689
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
0/38.3Aceptación de PR — sin PR decididos o sin datos
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs0
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Excluidos de la puntuación (sin datos o no aplicable): Resolución de issues, Aceptación de PR. Los pesos restantes se han renormalizado.
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
4.3/25Alcance del propietario — 3 seguidores de chipallen2
18.9/25Trayectoria — 8 repos públicos, cuenta de ~13 años
Datos de entrada utilizados
followers3
owner_typeUser
is_verified
owner_loginchipallen2
public_repos8
account_age_days4765
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 — 1 paquete(s) en npm
35/35Recencia de publicación — última publicación hace 5 días
20/20Historial de versiones — 20 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packages@chipallen2/snazi
ecosystemsnpm
any_deprecatedno
min_days_since_publish5

Calidad de Ingeniería

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

62Moderado · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 2 flujo(s) de trabajo
24/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — sin datos
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: CI-Tests. Los pesos restantes se han renormalizado.

Documentación

65Moderado
Cómo se puntúa
30/30README
0/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — https://soup-nazi-agent.vercel.app
10/10Descripción del repositorio
0/10Topics
10/10Wiki
Datos de entrada utilizados
topics
has_wiki
homepagehttps://soup-nazi-agent.vercel.app
has_readme
has_docs_dirno
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?

27Crítico · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — sin datos
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
5/5Packaging — packaging workflow detected
1/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 2
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — sin datos
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 27 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate2,7
Excluidos de la puntuación (sin datos o no aplicable): ci_tests, signed_releases. Los pesos restantes se han renormalizado.

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.

58Moderado · 0% del índice global
Cómo se puntúa
0/45Instrucciones para agentes — sin CLAUDE.md / AGENTS.md / reglas de editor
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 47 de 61 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,77
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
0/18Arranque con un solo comando
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — packages/snazi/tsconfig.json, packages/web/tsconfig.json
10/10Entorno reproducible — lockfile
10/10Práctica demostrada con agentes — 5 de los últimos 61 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
2/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 2
Datos de entrada utilizados
has_nixno
has_tests
lockfilespackage-lock.json
has_dockerfileno
typed_language
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configspackages/snazi/tsconfig.json, packages/web/tsconfig.json
agent_commit_share0,082
toolchain_manifests
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — TypeScript (tipado estático)
55/55Tamaños de archivo manejables — 0/86 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageTypeScript
largest_source_bytes50.002
source_files_sampled86
oversized_source_files0

Datos clave

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

Advertencias de recopilación de datos

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository
  • deps.dev does not index npm:@chipallen2/snazi@0.6.5; advisories assessed against the repository dependency graph instead

Más detalle

OpenSSF Scorecard 2.7 / 10
2.7agregado

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-23 00:29 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
n/dCI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
10Packagingpackaging workflow detected
2Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 2
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
n/dSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities27 existing vulnerabilities detected
Dependencias directas 4
RegistroPaqueteRestricción de versiónManifiesto
npm@supabase/supabase-js^2.45.0packages/web/package.json
npmnext14.2.35packages/web/package.json
npmreact^18.3.1packages/web/package.json
npmreact-dom^18.3.1packages/web/package.json
Todas las dependencias no recopilado

No fue posible recopilar el conjunto de dependencias resuelto para este informe: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 4525,
      "has_wiki": true,
      "homepage": "https://soup-nazi-agent.vercel.app",
      "languages": {
        "CSS": 2914,
        "Shell": 3567,
        "JavaScript": 174478,
        "TypeScript": 437857
      },
      "pushed_at": "2026-07-17T16:46:33Z",
      "created_at": "2026-06-26T03:23:13Z",
      "owner_type": "User",
      "updated_at": "2026-07-17T16:46:44Z",
      "description": "No messages for you. A communication gating layer for AI agents to prevent prompt injection.",
      "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": "Chip Allen",
      "type": "User",
      "login": "chipallen2",
      "company": null,
      "location": null,
      "followers": 3,
      "avatar_url": "https://avatars.githubusercontent.com/u/4950543?v=4",
      "created_at": "2013-07-05T20:01:27Z",
      "is_verified": null,
      "public_repos": 8,
      "account_age_days": 4765
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.6.5",
          "kind": "patch",
          "published_at": "2026-07-17T16:49:07Z"
        },
        {
          "tag": "v0.6.4",
          "kind": "patch",
          "published_at": "2026-07-11T01:19:45Z"
        },
        {
          "tag": "v0.6.3",
          "kind": "patch",
          "published_at": "2026-07-09T20:03:25Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-07-08T17:40:40Z"
        },
        {
          "tag": "v0.5.4",
          "kind": "patch",
          "published_at": "2026-07-06T23:20:48Z"
        },
        {
          "tag": "v0.5.3",
          "kind": "patch",
          "published_at": "2026-07-06T20:56:28Z"
        },
        {
          "tag": "v0.5.2",
          "kind": "patch",
          "published_at": "2026-07-05T23:06:52Z"
        },
        {
          "tag": "v0.5.1",
          "kind": "patch",
          "published_at": "2026-07-03T16:03:32Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-07-03T15:19:23Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-07-02T16:05:40Z"
        },
        {
          "tag": "v0.2.9",
          "kind": "patch",
          "published_at": "2026-07-01T23:37:22Z"
        },
        {
          "tag": "v0.2.7",
          "kind": "patch",
          "published_at": "2026-07-01T23:00:41Z"
        },
        {
          "tag": "v0.2.6",
          "kind": "patch",
          "published_at": "2026-07-01T22:08:42Z"
        },
        {
          "tag": "v0.2.5",
          "kind": "patch",
          "published_at": "2026-06-29T02:19:21Z"
        },
        {
          "tag": "v0.2.3",
          "kind": "patch",
          "published_at": "2026-06-28T04:16:10Z"
        },
        {
          "tag": "v0.2.2",
          "kind": "patch",
          "published_at": "2026-06-27T03:50:12Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-06-27T03:23:22Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-06-26T06:25:00Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2026-06-26T04:32:27Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "6ac3a950b091d9df08aa3e40a73e345a09b5de86",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.6.5",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-07-17T16:46:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "00ef682edfe8eaaffb0c0916cd41e37791671a10",
          "body": "Add draft capability for both Gmail and Outlook channels, working through\nboth local send and remote-send paths. When --draft is passed, the message\nis saved to the account's Drafts folder without sending.\n\n- types.ts: add draft?: boolean to SendOptions\n- gmail.ts: POST to /drafts instead of /messag\n[…]\ns: add --draft flag to send + remote-send commands + help text\n- README.md: document the --draft flag\n\nNot supported with --reply-to or --forward-msg (draft replies/forwards\nare a future enhancement).",
          "is_bot": false,
          "headline": "feat: add --draft flag to save emails as drafts (Gmail + Outlook)",
          "author_name": "Gofer",
          "author_login": "goferchip",
          "committed_at": "2026-07-15T15:33:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8fa23a9808b2b3bfe9c681bdac07071c147522d4",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.6.4",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-07-11T01:16:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "86bd5c0d732144ea5f178c985a3d58d105575bb9",
          "body": "When the agent sends a text or email to someone, that recipient is\nautomatically upserted to 'approved' on the channel's sender list so\nthe agent can read their reply without a manual approve step.\n\n- New sna_users.auto_approve_on_send boolean (default TRUE)\n- POST /api/senders/auto-approve endpoint (checks flag, no-op if off)\n- Serve daemon calls it fire-and-forget after every successful send\n- Account page toggle on snazi.dev to enable/disable per account",
          "is_bot": false,
          "headline": "feat: auto-approve-on-send",
          "author_name": "Gofer",
          "author_login": "goferchip",
          "committed_at": "2026-07-11T01:16:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "888486ad470420ec63f7d1ab92697acbe8c2b02f",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.6.3",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-07-09T20:00:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "922a276bdf8306a6b5d38d29bc07fc7e48a00c68",
          "body": "npm@latest resolves to 12.0.0, which breaks the release two ways:\n1. --provenance fails with 'Cannot find module sigstore' (npm/cli#9722)\n2. dependency install scripts are hard-blocked by default (better-sqlite3\n   native build skipped -> test crash)\nPin to npm@11 (latest 11.x): OIDC/provenance-capable, only warns on\nscripts. Combined with the explicit 'npm rebuild better-sqlite3' step this\nmakes the release deterministic again. Pure CI fix.",
          "is_bot": false,
          "headline": "ci: pin global npm to 11.x (npm@latest is now buggy v12 prerelease)",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-07-09T20:00:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "545e85211d4d707936f2060631c64edc1cc37af0",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.6.2",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-07-09T19:56:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b94782f425039e30dc85491bb1382ccbc7ff26af",
          "body": "npm 11.16+ blocks dependency install scripts by default (new allowScripts\nallowlist; becomes a hard failure in npm 12). The release workflow does\n'npm install -g npm@latest' before 'npm ci', so the runner started skipping\nbetter-sqlite3's native build - both-sides.test.cjs then crashed with\n'Could n\n[…]\ne. Fix:\nallow-list better-sqlite3 in package.json (allowScripts) AND rebuild it\nexplicitly in the workflow after npm ci as belt-and-suspenders. Unrelated\nto the forward feature; pure CI/toolchain fix.",
          "is_bot": false,
          "headline": "ci: build better-sqlite3 native addon so tests run under npm >= 11.16",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-07-09T19:56:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5caac0122263f88d5513a4e38a997eac6f70c04e",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.6.1",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-07-09T19:52:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dc155021837f51e2a13b7bc839b373c8cb9cf7cd",
          "body": "Adds a genuine forward-a-specific-message capability, mirroring the\n--reply-to threading feature added in v0.5.4. Previously there was NO\nforward capability at all - the assistant faked forwards by pasting the\noriginal text into a brand-new email (no Fwd: marker, no original\nheaders, no attachments)\n[…]\nedup, header block,\nattachment round-trip), Outlook native forward, and serve /send\npassthrough for both. Full existing suite still green (zero\nregressions). README updated with a new Forward section.",
          "is_bot": false,
          "headline": "feat(email): real forward for gmail + outlook (--forward-msg)",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-07-09T19:52:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "111d18dd9d89ef6f078d4049c99a71af93f2648f",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.6.0",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-07-08T17:38:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5d0c36d9ed0bbcec99eb00b0844a06cf99cb5348",
          "body": "…-day/timed events (ungated)",
          "is_bot": false,
          "headline": "feat(calendar): Outlook calendar adapter - list calendars, create all…",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-07-08T17:37:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "02a40b16eaa7fe7f18be19ef2450902e9bf3f8e8",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.5.4",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-07-06T23:18:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bbda8a80ea513a8a4c9e598b4867631f775e08e5",
          "body": "- gmail/outlook reads now include native message id per row\n- new SendOptions.replyToMessageId + replyAll\n- gmail: builds In-Reply-To/References + sets threadId for real Gmail threading\n- outlook: uses Graph native /reply and /replyAll endpoints\n- cli: --reply-to <messageId> and --reply-all flags on\n[…]\ny sends unchanged (byte-identical), full backward compatibility\n- tests added for gmail reply headers, outlook reply endpoints, serve /send passthrough\n- README updated with reply/thread usage section",
          "is_bot": false,
          "headline": "feat(email): real reply/reply-all threading for gmail + outlook",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-07-06T23:18:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "da3106a74cad1d477881dd3a9d9a61913dfef000",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.5.3",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-07-06T20:54:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0352905bc709d502d12745fd52b1edbe91b160b3",
          "body": "… field)",
          "is_bot": false,
          "headline": "gmail/outlook: add --from send-as alias override on send (+/send from…",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-07-06T20:54:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7a3b6c7d3b3a662b5d6f1cf1332659555f45556b",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.5.2",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-07-05T23:04:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "249e3e7d344f2fd15dda2900292b6da0368bb3c5",
          "body": null,
          "is_bot": false,
          "headline": "test: register serve-send.test.cjs in the test script",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-07-05T23:04:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "33d3b7d795ebec0ccdbd43a141fe010631c08b78",
          "body": "Add --html-file/--html-text + --subject to snazi send / remote-send.\nGmail builds a multipart/alternative (text + html) raw message; Outlook\nsends contentType HTML. Plaintext alternative auto-derived from HTML via\nhtmlToText when --text is omitted. Serve /send accepts optional\nsubject/html fields; body cap raised to 512 KiB for /send. Non-email\nchannels (imessage) ignore html and send the plaintext body. Plain-text\nsend path unchanged. New serve-send test + gmail/outlook html tests.",
          "is_bot": false,
          "headline": "feat(email): HTML sending for gmail + outlook adapters",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-07-05T23:04:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "484274b5c465f2102b400e3f7bacbc9113736b7a",
          "body": "checkSender/getSender only looked up the exact address + full subdomain\nwildcard (*@communications.paypal.com), never the root-domain wildcard\n(*@paypal.com) written by the /decide 'Allow root domain, including all\nsubdomains' button. A subdomain sender stayed 'unknown' despite an explicit\nroot-doma\n[…]\nd > root wildcard, most-specific existing decision\nwins (approve OR deny). Wire both checkSender and getSender through it so the\ngate and the decide-page display can never disagree. 13 new unit tests.",
          "is_bot": false,
          "headline": "fix(gate): honor root-domain wildcard approvals for subdomain senders",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-07-04T01:06:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2a65511bdd36bd609fa1a180a1a9974793d4358b",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.5.1",
          "author_name": "Gofer",
          "author_login": "goferchip",
          "committed_at": "2026-07-03T16:01:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "615a8bcea538f0ab23b3f37aadf866ac09d5a1f1",
          "body": null,
          "is_bot": false,
          "headline": "docs: update README to reflect capability gate + Schwab adapter",
          "author_name": "Gofer",
          "author_login": "goferchip",
          "committed_at": "2026-07-03T16:01:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "debfdd4baacf3178646c2ba884718ed224e97921",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump to 0.5.0",
          "author_name": "Gofer",
          "author_login": "goferchip",
          "committed_at": "2026-07-03T15:17:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b160df985c43e26c8ad69e43423598fed4525156",
          "body": "- Extend snazi from messaging gate to capability gate\n- New sna_actions table (007_actions.sql) - add-only, no existing data touched\n- packages/web: /api/action-link (mint action approval links)\n- packages/web: /api/actions/[code]/decide (approve/deny handler)\n- packages/web: /decide page handles ?a\n[…]\n token mgmt + read API)\n- packages/snazi: server.ts new endpoints /schwab/accounts /schwab/transactions /schwab/action\n- README: Capability Adapters section\n- soup-nazi skill updated with Schwab usage",
          "is_bot": false,
          "headline": "feat: Schwab capability adapter + generalized action approval system",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-07-03T06:42:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "31304dda5c48c966d979b46822f737b4ed304da3",
          "body": "Add server-side filter/rule management across the serve host and CLI.\n\nAdapters:\n- Gmail (gmail-chip/gmail-gofer): create/list/get/delete via\n  settings/filters. No update API (delete+recreate); simplified actions\n  delete/archive/label/markRead/forward mapped to label ops. Raw\n  criteria/actions pa\n[…]\nping,\nendpoint routing, auth, 405/404/400 paths). Backward compatible.\n\nNote: serve host's Gmail OAuth needs the gmail.settings.basic scope to\nmanage filters; a missing scope surfaces as a Google 403.",
          "is_bot": false,
          "headline": "feat(filters): full CRUD for Gmail filters + Outlook rules (v0.4.0)",
          "author_name": "Gofer",
          "author_login": "goferchip",
          "committed_at": "2026-07-02T16:03:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ad97491214777d1923539fc39c58d526f84e3e90",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump to 0.2.9 (retry after tlog conflict on 0.2.8)",
          "author_name": "Gofer",
          "author_login": "goferchip",
          "committed_at": "2026-07-01T23:35:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3c5e76f6e01df60f19a885e5a8699e7548e6d1c0",
          "body": "Multipart emails were read from the text/plain part, which often lacks\nclean unsubscribe URLs. Now prefer text/html (htmlToText preserves links\nas [text](url)), falling back to text/plain, so agents can find and\nfollow unsubscribe/preference links.",
          "is_bot": false,
          "headline": "fix(gmail): prefer text/html body so unsubscribe links survive",
          "author_name": "Gofer",
          "author_login": "goferchip",
          "committed_at": "2026-07-01T23:31:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e02220ef2b1b35a54aaa6eae362dbc9ed72017d9",
          "body": "…read)\n\nImplements the MessageAction contract for the Gmail adapter:\n- archive: removes INBOX label\n- delete: moves to trash\n- markRead/markUnread: toggle UNREAD label\nSupports both single messageId and bulk sender-based targeting.",
          "is_bot": false,
          "headline": "feat(gmail): add performMessageAction (archive/delete/markRead/markUn…",
          "author_name": "Gofer",
          "author_login": "goferchip",
          "committed_at": "2026-07-01T22:58:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "16f142ce013b0283ed70897e9b55fdad30e4ed24",
          "body": "Unsubscribe URLs and other links were being stripped when converting\nHTML email bodies to plain text. Now <a href=\"https://...\"> links are\nconverted to [text](url) format before tag-stripping, so agents can\nextract and follow them.\n\nNon-http links (mailto:, tel:, etc.) continue to be stripped.\nOutlook adapter inherits the fix via shared import.",
          "is_bot": false,
          "headline": "feat(mail): preserve hyperlinks as [text](url) in htmlToText",
          "author_name": "Gofer",
          "author_login": "goferchip",
          "committed_at": "2026-07-01T22:06:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "30c7b49533f4cb998b7ebad5669d361604045a25",
          "body": "- Add sna_decide_shortcodes table + /decide?s=<code> compact links\n  (API mints a shortcode row and returns the short URL; long inline URLs\n  still resolve for backward compat; shortcodes carry no extra authority,\n  the stored sig is re-verified downstream)\n- Remove the asymmetric guard that require\n[…]\nole domain; a valid signed link's HMAC is proof enough (domain-match\n  guard retained so a link can only touch its own domain)\n- Middleware passes /decide?s= through to the page for DB-side resolution",
          "is_bot": false,
          "headline": "feat: shortcode /decide links + allow whole domain from signed link",
          "author_name": "Christopher Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-07-01T14:11:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "eee3c6e971399b7a1733f195c590e56f9e16152d",
          "body": null,
          "is_bot": false,
          "headline": "fix: lower /label body cap to 4KB to match test expectation",
          "author_name": "Gofer",
          "author_login": "goferchip",
          "committed_at": "2026-06-30T20:51:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4e8765d5a1db062522aa6a0b0659bac8ebcf45fc",
          "body": null,
          "is_bot": false,
          "headline": "feat: domain wildcard approve/deny - block/allow entire @domain at once",
          "author_name": "Gofer",
          "author_login": "goferchip",
          "committed_at": "2026-06-30T20:38:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5e9cbf617679c1a64219331ae0b0e4f146620122",
          "body": "…ad of nuking DOM",
          "is_bot": false,
          "headline": "fix: CloseButton - detect close failure and show clean fallback inste…",
          "author_name": "Gofer",
          "author_login": "goferchip",
          "committed_at": "2026-06-30T19:34:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "96cdde3ba327d2f4e9fe784a4531477c29ed01c5",
          "body": "…ed users",
          "is_bot": false,
          "headline": "fix: allow /decide?done= success state without auth for unauthenticat…",
          "author_name": "Gofer",
          "author_login": "goferchip",
          "committed_at": "2026-06-30T19:27:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e4a904f1503d7509007f7be6c50583840bdc9cc1",
          "body": "- POST /action endpoint on serve host (bearer-gated, never approval-gated)\n- Outlook adapter: performMessageAction via Microsoft Graph\n- Bulk sender targeting + continue-on-error with partial-failure count\n- resolveActionableAdapter in channels/index.ts\n- remoteAction in client.ts\n- remote-action CL\n[…]\nr <addr> --channel <id>\n\nSupported actions: archive, delete, markRead, markUnread\nGmail/iMessage return clean 501 (not yet implemented)\nNote: sender fetch capped at 100 msgs; pagination is a follow-up",
          "is_bot": false,
          "headline": "feat: add email action support (archive/delete/markRead/markUnread)",
          "author_name": "Gofer",
          "author_login": "goferchip",
          "committed_at": "2026-06-29T21:27:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "835bc07dcd60a64130a461877343ed88d7dc65a6",
          "body": null,
          "is_bot": false,
          "headline": "fix: close button - reassociate tab before closing, fallback to message",
          "author_name": "Gofer",
          "author_login": "goferchip",
          "committed_at": "2026-06-29T18:29:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c5df4b18585140918b7dd48868e3d8dbbf36a9d2",
          "body": "… home",
          "is_bot": false,
          "headline": "fix: decide success page shows allowed/blocked instead of redirecting…",
          "author_name": "Gofer",
          "author_login": "goferchip",
          "committed_at": "2026-06-29T17:29:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "61052c6ce98bda70045367a3941940ae717a80b6",
          "body": "Removed the message 'No messages for you.' from the README.",
          "is_bot": false,
          "headline": "Remove message from README",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-06-29T15:48:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5b2c588c04faa6ae1d8b1983b666c74fde077d38",
          "body": "Removed extra line breaks and cleaned up formatting.",
          "is_bot": false,
          "headline": "Refactor README formatting",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-06-29T15:48:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7ff539fd0d8c5213fa18733fce130459ea28dec6",
          "body": null,
          "is_bot": false,
          "headline": "Fix image source URL in README.md",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-06-29T15:47:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dd2e686d53601a1093ef13fdadf413c1e93c7973",
          "body": "Removed duplicate Snazi logo image from README.",
          "is_bot": false,
          "headline": "Remove duplicate logo image from README",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-06-29T15:47:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "69bd7bae84c8037ae869a8a282682ce3661ec918",
          "body": "Updated README to include logo and remove old text.",
          "is_bot": false,
          "headline": "Add logo to README and remove live site text",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-06-29T15:44:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8dba3ede0168ad49febc65ea19ef3e4e229893ee",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.2.5",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-06-29T02:17:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "486d6c9ce7116f32d9f25be8b24dbb66a6d4cb44",
          "body": null,
          "is_bot": false,
          "headline": "v0.2.4: outlook send-as alias via auth.user",
          "author_name": "Gofer",
          "author_login": "goferchip",
          "committed_at": "2026-06-29T02:14:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e49976f2a48febf4ee06e18a544cdcd35b3f6a65",
          "body": null,
          "is_bot": false,
          "headline": "outlook: send from ctx.auth.user alias when set",
          "author_name": "Gofer",
          "author_login": "goferchip",
          "committed_at": "2026-06-29T02:13:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "982e06a183b82ebdffcf20932daea77f71e5bea0",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.2.3",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-06-28T04:14:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2a484e1cfecf73af024a9bb297b1f41591842106",
          "body": null,
          "is_bot": false,
          "headline": "updated clis and instructions",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-06-28T04:04:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3ab78ad19db74727caf7ae4bb2b11d10e4d41741",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.2.2",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-06-27T03:48:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "77d6c6b78f2911a30061cae97bb089aee4c5bf0d",
          "body": null,
          "is_bot": false,
          "headline": "improved the cli start stop restart stuff",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-06-27T03:48:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4b243f949705c0a517a6aca5edb676be25efb254",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.2.1",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-06-27T03:21:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dbfb30bc6f6516eba411d0da416a084763a37c8a",
          "body": null,
          "is_bot": false,
          "headline": "site updates",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-06-27T03:18:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dd3c6b0ebb56af932ffec5f36a2ab76a8a33d9e9",
          "body": null,
          "is_bot": false,
          "headline": "updates",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-06-27T02:53:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "06123f17047c6289c5c565ccbef40ef4cf277025",
          "body": null,
          "is_bot": false,
          "headline": "updated channels to have names so you can have multiple",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-06-27T02:06:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "987b49d1bf3d4959abbd20855c1bdc615f13cfc0",
          "body": "…shboard/account/channels\n\n- Add public marketing landing page at / for logged-out visitors (dashboard still served to authed users)\n- New brand design system: stone neutrals + amber accent, no-entry logo mark\n- Shared site chrome: centered footer (sticky bottom), responsive header with active nav +\n[…]\now/Block buttons, red Block\n- Account: token mask/reveal/copy, config code-block wraps with copy (no longer clips key)\n- Channels: stacks to cards on mobile\n- UI/UX only, no feature or backend changes",
          "is_bot": false,
          "headline": "feat(web): UX overhaul - landing page, brand system, polished auth/da…",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-06-26T21:52:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6a099b476c352b71c2a7bf7669038e35b488e51e",
          "body": null,
          "is_bot": false,
          "headline": "fixes for approval/block success state",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-06-26T19:46:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e16e721ab56a4fe93ddc81b3abdcfb155f5bb6ee",
          "body": "Add display-only contact_name to /list-new, /check, /resolve and the 200\nbody of /read (plus local CLI list-new/check), resolved from the serve\nhost's local macOS Contacts (AddressBook) by phone/email.\n\nSecurity invariants (enforced + tested):\n- contact_name is DISPLAY-ONLY: never affects status/app\n[…]\nenting trusted-name spoofing).\n\nTests: test/contacts.test.cjs (synthetic AddressBook) + test/serve-contacts.test.cjs\n(denied/unknown sender gets contact_name but /read still 403). Bump 0.1.1 -> 0.2.0.",
          "is_bot": false,
          "headline": "feat(snazi): add macOS Contacts name enrichment (contact_name)",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-06-26T06:22:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f4ca21a1b7ebf5b48b3fb91c09d2a390e9732bcc",
          "body": "npm version only auto-commits/tags at the git root, so in this monorepo it left\nthe bump uncommitted. release.sh now bumps with --no-git-tag-version and creates\nthe commit + tag at the repo root, so `npm run release:*` is one command again.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "ci: fix release script for monorepo layout",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-06-26T04:32:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "84532698d29004005371894d39bd994360e101d5",
          "body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "release: v0.1.1",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-06-26T04:30:42Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ee587e455f5d071d12f75ecc24282417677fb75c",
          "body": "Switch release.yml to OIDC auth (Node 24 / npm >= 11.5.1, id-token: write,\nno stored token). Document the one-time manual first publish + trusted\npublisher setup, since npm cannot publish a brand-new package over OIDC.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "ci: use npm Trusted Publishing (OIDC) instead of NPM_TOKEN",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-06-26T04:26:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "279584b5c5a37bc4ef94151958e035e8eebd2779",
          "body": "Add `snazi send` / `remote-send` and a POST /send serve endpoint that send\noutbound messages. Sending is never gated by the approval list — the soup nazi\nonly blocks reading. Recipients are validated to E.164/email and message text\nis control-char filtered; the iMessage adapter sends via AppleScript\n[…]\n/PR to main; release.yml publishes to npm with provenance and cuts a\nGitHub Release when a v* tag is pushed. Cut releases with `npm run release:patch`.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "feat(snazi): add ungated send + CI/CD publish pipeline",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-06-26T04:23:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3ee7afc3ccd7138f18d3308e3d3caad2040facca",
          "body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Initial commit",
          "author_name": "Chip Allen",
          "author_login": "chipallen2",
          "committed_at": "2026-06-26T03:15:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        }
      ],
      "releases_count": 19,
      "commits_last_year": 61,
      "latest_release_at": "2026-07-17T16:49:07Z",
      "latest_release_tag": "v0.6.5",
      "releases_from_tags": false,
      "days_since_last_push": 5,
      "active_weeks_last_year": 4,
      "days_since_latest_release": 5,
      "mean_days_between_releases": 1.7
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "@chipallen2/snazi",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "imessage",
            "cli",
            "ai-agent",
            "prompt-injection",
            "gate",
            "macos"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@chipallen2/snazi",
          "is_deprecated": false,
          "latest_version": "0.6.5",
          "repository_url": "https://github.com/chipallen2/snazi",
          "versions_count": 20,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 3728,
          "first_published_at": "2026-06-26T03:09:46.791000Z",
          "latest_published_at": "2026-07-17T16:49:05.910000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 3,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "packages/snazi/tsconfig.json",
        "packages/web/tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 50002,
      "source_files_sampled": 86,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [],
      "dependencies": [
        {
          "name": "@supabase/supabase-js",
          "manifest": "packages/web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.45.0"
        },
        {
          "name": "next",
          "manifest": "packages/web/package.json",
          "ecosystem": "npm",
          "version_constraint": "14.2.35"
        },
        {
          "name": "react",
          "manifest": "packages/web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^18.3.1"
        },
        {
          "name": "react-dom",
          "manifest": "packages/web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^18.3.1"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 0,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "chipallen2",
          "commits": 42,
          "avatar_url": "https://avatars.githubusercontent.com/u/4950543?v=4"
        },
        {
          "type": "User",
          "login": "goferchip",
          "commits": 19,
          "avatar_url": "https://avatars.githubusercontent.com/u/293690008?v=4"
        }
      ],
      "contributors_sampled": 2,
      "top_contributor_share": 0.689
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "release.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": null,
            "reason": "no pull request found",
            "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/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 2,
            "reason": "dependency not pinned by hash detected -- score normalized to 2",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "27 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "6ac3a950b091d9df08aa3e40a73e345a09b5de86",
        "ran_at": "2026-07-23T00:29:34Z",
        "aggregate_score": 2.7,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-17T16:47:11Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": null,
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/chipallen2/snazi",
    "host": "github.com",
    "name": "snazi",
    "owner": "chipallen2"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "at_risk",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 48,
      "inputs": {
        "security": 27,
        "vitality": 73,
        "community": 34,
        "governance": 36,
        "engineering": 62
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 73,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "commits_last_year": 61,
              "human_commit_share": 1,
              "days_since_last_push": 5,
              "active_weeks_last_year": 4
            },
            "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": "4/52 weeks with commits",
                "points": 2.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 4
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "61 commits in the last year",
                "points": 16.1,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 61
                    }
                  }
                ],
                "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": 19,
              "latest_release_tag": "v0.6.5",
              "releases_from_tags": false,
              "days_since_latest_release": 5,
              "mean_days_between_releases": 1.7
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "19 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 19
                    }
                  }
                ],
                "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 ~1.7 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 1.7
                    }
                  }
                ],
                "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": 34,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 5,
            "inputs": {
              "forks": 0,
              "stars": 3,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "3 stars",
                "points": 4.9,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 60,
            "inputs": {
              "packages": [
                "@chipallen2/snazi"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 3728
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "3,728 downloads/month across npm",
                "points": 47.6,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 3728,
                      "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": "at_risk",
        "name": "Sustainability & Governance",
        "value": 36,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 19,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 2,
              "top_contributor_share": 0.689
            },
            "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 69% of commits",
                "points": 7,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 69
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "2 contributors",
                "points": 2.7,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "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": "critical",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution",
                    "pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "merged_prs": 0,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "no decided pull requests or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_decided_prs_or_data",
                    "params": {}
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 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": 41,
            "inputs": {
              "followers": 3,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "chipallen2",
              "public_repos": 8,
              "account_age_days": 4765
            },
            "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": "3 followers of chipallen2",
                "points": 4.3,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 3,
                      "login": "chipallen2"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "8 public repos, account ~13 yr old",
                "points": 18.9,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 8
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 13
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "@chipallen2/snazi"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 5
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 5 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "20 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 20
                    }
                  }
                ],
                "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": "moderate",
        "name": "Engineering Quality",
        "value": 62,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 60,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 65,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": "https://soup-nazi-agent.vercel.app",
              "has_readme": true,
              "has_docs_dir": false,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://soup-nazi-agent.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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "critical",
        "name": "Security",
        "value": 27,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "critical",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 27,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 2.7
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 2",
                "points": 1,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "27 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 58,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.77,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "47 of 61 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 47,
                      "sampled": 61
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "packages/snazi/tsconfig.json",
                "packages/web/tsconfig.json"
              ],
              "agent_commit_share": 0.082,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "packages/snazi/tsconfig.json, packages/web/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "packages/snazi/tsconfig.json, packages/web/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": "5 of the last 61 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 5,
                      "sampled": 61
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 2",
                "points": 2,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 50002,
              "source_files_sampled": 86,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "TypeScript (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "TypeScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/86 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 86,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index npm:@chipallen2/snazi@0.6.5; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-23T00:29:40.737352Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/c/chipallen2/snazi.svg",
  "full_name": "chipallen2/snazi",
  "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.