Registro público
Informe de salud del softwareesquema 0.26.0 · métricas 1.13.0 · 2026-07-22 03:42 UTC

microvn / specpipe

Spec-first development toolkit for agentic AI coding agents — skills + guardrails for Claude Code, Codex, Cursor, Antigravity, and more.

JavaScript · Shell · HTMLMIT★ 2 estrellas⑂ 0 forksdesde jun 2026Ver en GitHub ↗

microvn/specpipe tiene un índice de salud de 57 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Engineering Quality (89/100) y la más baja, Sustainability & Governance (38/100). Se actualizó por última vez hace 4 días. Una sola persona concentra la mayor parte del trabajo reciente.

57
global / 100
Moderado

Índice de salud del software

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

57
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

microvnCuenta personal
13 seguidores117 repositorios públicosdesde may 2014OkLabel

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
npmspecpipe2.4.1254314hace 4 díasaiai-agentscoding-agentclaude-codecodexcursorantigravityspec-firsttddskillsguardrailsdeveloper-tools

Métricas por categoría

Vitalidad

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

72Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 4 días
8.3/36Cadencia de commits — 12/52 semanas con commits
18/18Volumen de commits — 192 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_year192
human_commit_share1
days_since_last_push4
active_weeks_last_year12
Cómo se puntúa
16.2/27Publica versiones — 67 etiquetas de versión (sin releases de GitHub)
36/36Recencia de las versiones — última versión hace 4 días
27/27Cadencia de publicación — una versión cada ~3,1 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count67
latest_release_tagv2.4.1
releases_from_tags
days_since_latest_release4
mean_days_between_releases3,1
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?

47En riesgo · 18% del índice global
Cómo se puntúa
0/60Estrellas — 2 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars2
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonbelow_threshold
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (MIT)
18/18Guía CONTRIBUTING
13.5/13.5Código de conducta
0/7.2Plantilla de issues
6.3/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributing
has_issue_templateno
has_code_of_conduct
has_pull_request_template
Cómo se puntúa
45.4/80Descargas mensuales — 2543 descargas/mes en npm
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packagesspecpipe
dependents
ecosystemsnpm
total_downloads
monthly_downloads2543
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?

38En riesgo · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0/22.5Distribución de commits — el principal contribuyente firma el 100% de los commits
1.4/13.5Amplitud de contribuyentes — 1 contribuyentes
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
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
8.2/25Alcance del propietario — 13 seguidores de microvn
25/25Trayectoria — 117 repos públicos, cuenta de ~12 años
Datos de entrada utilizados
followers13
owner_typeUser
is_verified
owner_loginmicrovn
public_repos117
account_age_days4442
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 4 días
20/20Historial de versiones — 14 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesspecpipe
ecosystemsnpm
any_deprecatedno
min_days_since_publish4

Calidad de Ingeniería

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

89Excelente · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 1 flujo(s) de trabajo
24/24Pruebas presentes
16/16Configuración de linter — eslint.config.js
0/9.6Hooks de pre-commit
6.4/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — sin datos
Datos de entrada utilizados
has_ci
has_tests
has_editorconfig
has_linter_config
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

90Excelente
Cómo se puntúa
30/30README
25/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — https://specpipe.vercel.app
10/10Descripción del repositorio
0/10Topics
10/10Wiki
Datos de entrada utilizados
topics
has_wiki
homepagehttps://specpipe.vercel.app
has_readme
has_docs_dir
has_description

Seguridad

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

39En riesgo · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — sin datos
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.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
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
0/5Packaging — sin datos
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — no SAST tool detected
5/5Security-Policy — security policy file detected
0/7.5Signed-Releases — sin datos
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
6/7.5Vulnerabilities — 2 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated14
scorecard_versionv5.5.0
checks_inconclusive4
scorecard_aggregate3,8
Excluidos de la puntuación (sin datos o no aplicable): branch_protection, ci_tests, packaging, 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.

45En riesgo · 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 — 99 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,99
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
0/18Arranque con un solo comando
22/22Pruebas automatizadas
11/11Configuración de lint / formato — eslint.config.js
0/11Verificación estática de tipos
10/10Entorno reproducible — lockfile
4/10Práctica demostrada con agentes — 2 de los últimos 100 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfilespackage-lock.json
has_dockerfileno
typed_languageno
bootstrap_files
has_devcontainerno
has_linter_config
typecheck_configs
agent_commit_share0,02
toolchain_manifests
dependency_bot_commit_share0
Cómo se puntúa
0/45Código verificable por tipos — JavaScript sin configuración de verificación de tipos
55/55Tamaños de archivo manejables — 0/31 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageJavaScript
largest_source_bytes49.571
source_files_sampled31
oversized_source_files0
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
0/20Servidor MCP
40/40Ejemplos ejecutables — examples
Datos de entrada utilizados
example_dirsexamples
has_mcp_signalno
api_schema_files

Datos clave

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

Advertencias de recopilación de datos

  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository
  • deps.dev does not index npm:specpipe@2.4.1; advisories assessed against the repository dependency graph instead

Más detalle

OpenSSF Scorecard 3.8 / 10
3.8agregado

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-22 03:42 UTC

10Binary-Artifactsno binaries found in the repo
n/dBranch-Protectioninternal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
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
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
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
n/dPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTno SAST tool detected
10Security-Policysecurity policy file detected
n/dSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
8Vulnerabilities2 existing vulnerabilities detected
Dependencias directas 3
RegistroPaqueteRestricción de versiónManifiesto
npm@clack/prompts^1.6.0cli/package.json
npmchalk^5.4.1cli/package.json
npmcommander^13.1.0cli/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": 1065,
      "has_wiki": true,
      "homepage": "https://specpipe.vercel.app",
      "languages": {
        "CSS": 113,
        "HTML": 69710,
        "Shell": 121558,
        "JavaScript": 231596,
        "Go Template": 18177
      },
      "pushed_at": "2026-07-17T08:17:26Z",
      "created_at": "2026-06-24T04:50:52Z",
      "owner_type": "User",
      "updated_at": "2026-07-17T08:17:48Z",
      "description": "Spec-first development toolkit for agentic AI coding agents — skills + guardrails for Claude Code, Codex, Cursor, Antigravity, and more.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "JavaScript",
      "significant_languages": [
        "JavaScript",
        "Shell",
        "HTML"
      ]
    },
    "owner": {
      "blog": "https://oklabel.vn/",
      "name": null,
      "type": "User",
      "login": "microvn",
      "company": "OkLabel",
      "location": null,
      "followers": 13,
      "avatar_url": "https://avatars.githubusercontent.com/u/7679875?v=4",
      "created_at": "2014-05-23T11:40:27Z",
      "is_verified": null,
      "public_repos": 117,
      "account_age_days": 4442
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v2.4.1",
          "kind": "patch",
          "published_at": "2026-07-17T08:17:22Z"
        },
        {
          "tag": "v2.4.0",
          "kind": "minor",
          "published_at": "2026-07-17T06:59:21Z"
        },
        {
          "tag": "v2.3.1",
          "kind": "patch",
          "published_at": "2026-07-06T06:50:10Z"
        },
        {
          "tag": "v2.3.0",
          "kind": "minor",
          "published_at": "2026-07-06T06:37:04Z"
        },
        {
          "tag": "v2.2.0",
          "kind": "minor",
          "published_at": "2026-07-02T19:54:15Z"
        },
        {
          "tag": "v2.1.2",
          "kind": "patch",
          "published_at": "2026-07-02T15:29:39Z"
        },
        {
          "tag": "v2.1.1",
          "kind": "patch",
          "published_at": "2026-07-02T10:22:19Z"
        },
        {
          "tag": "v2.1.0",
          "kind": "minor",
          "published_at": "2026-06-30T11:14:46Z"
        },
        {
          "tag": "v2.0.0",
          "kind": "major",
          "published_at": "2026-06-30T06:44:18Z"
        },
        {
          "tag": "v1.13.1",
          "kind": "patch",
          "published_at": "2026-06-19T10:05:41Z"
        },
        {
          "tag": "v1.13.0",
          "kind": "minor",
          "published_at": "2026-06-19T07:09:30Z"
        },
        {
          "tag": "v1.12.2",
          "kind": "patch",
          "published_at": "2026-06-02T03:10:22Z"
        },
        {
          "tag": "v1.12.1",
          "kind": "patch",
          "published_at": "2026-05-29T03:11:21Z"
        },
        {
          "tag": "v1.12.0",
          "kind": "minor",
          "published_at": "2026-05-29T02:43:23Z"
        },
        {
          "tag": "v1.11.4",
          "kind": "patch",
          "published_at": "2026-05-28T20:20:49Z"
        },
        {
          "tag": "v1.11.3",
          "kind": "patch",
          "published_at": "2026-05-28T20:05:33Z"
        },
        {
          "tag": "v1.11.2",
          "kind": "patch",
          "published_at": "2026-05-28T19:43:48Z"
        },
        {
          "tag": "v1.11.1",
          "kind": "patch",
          "published_at": "2026-05-28T18:56:01Z"
        },
        {
          "tag": "v1.11.0",
          "kind": "minor",
          "published_at": "2026-05-27T20:01:04Z"
        },
        {
          "tag": "v1.10.2",
          "kind": "patch",
          "published_at": "2026-05-26T19:19:33Z"
        },
        {
          "tag": "v1.10.1",
          "kind": "patch",
          "published_at": "2026-05-26T19:07:02Z"
        },
        {
          "tag": "v1.10.0",
          "kind": "minor",
          "published_at": "2026-05-26T18:52:06Z"
        },
        {
          "tag": "v1.9.2",
          "kind": "patch",
          "published_at": "2026-05-16T07:45:25Z"
        },
        {
          "tag": "v1.9.1",
          "kind": "patch",
          "published_at": "2026-05-15T11:12:05Z"
        },
        {
          "tag": "v1.9.0",
          "kind": "minor",
          "published_at": "2026-05-15T05:12:55Z"
        },
        {
          "tag": "v1.8.11",
          "kind": "patch",
          "published_at": "2026-05-03T17:22:36Z"
        },
        {
          "tag": "v1.8.10",
          "kind": "patch",
          "published_at": "2026-05-01T18:55:29Z"
        },
        {
          "tag": "v1.8.9",
          "kind": "patch",
          "published_at": "2026-05-01T18:49:45Z"
        },
        {
          "tag": "v1.8.8",
          "kind": "patch",
          "published_at": "2026-04-28T09:28:30Z"
        },
        {
          "tag": "v1.8.7",
          "kind": "patch",
          "published_at": "2026-04-27T17:04:59Z"
        },
        {
          "tag": "v1.8.6",
          "kind": "patch",
          "published_at": "2026-04-27T16:40:55Z"
        },
        {
          "tag": "v1.8.5",
          "kind": "patch",
          "published_at": "2026-04-25T18:50:45Z"
        },
        {
          "tag": "v1.8.4",
          "kind": "patch",
          "published_at": "2026-04-25T03:11:56Z"
        },
        {
          "tag": "v1.8.3",
          "kind": "patch",
          "published_at": "2026-04-25T03:03:23Z"
        },
        {
          "tag": "v1.8.2",
          "kind": "patch",
          "published_at": "2026-04-24T20:09:40Z"
        },
        {
          "tag": "v1.8.1",
          "kind": "patch",
          "published_at": "2026-04-24T19:45:04Z"
        },
        {
          "tag": "v1.8.0",
          "kind": "minor",
          "published_at": "2026-04-22T01:52:27Z"
        },
        {
          "tag": "v1.7.3",
          "kind": "patch",
          "published_at": "2026-04-20T18:25:35Z"
        },
        {
          "tag": "v1.7.2",
          "kind": "patch",
          "published_at": "2026-04-20T18:19:40Z"
        },
        {
          "tag": "v1.7.1",
          "kind": "patch",
          "published_at": "2026-04-20T18:17:19Z"
        },
        {
          "tag": "v1.7.0",
          "kind": "minor",
          "published_at": "2026-04-20T18:11:12Z"
        },
        {
          "tag": "v1.6.0",
          "kind": "minor",
          "published_at": "2026-04-20T08:11:02Z"
        },
        {
          "tag": "v1.5.9",
          "kind": "patch",
          "published_at": "2026-04-08T17:26:40Z"
        },
        {
          "tag": "v1.5.8",
          "kind": "patch",
          "published_at": "2026-04-08T16:47:06Z"
        },
        {
          "tag": "v1.5.7",
          "kind": "patch",
          "published_at": "2026-04-08T08:27:34Z"
        },
        {
          "tag": "v1.5.6",
          "kind": "patch",
          "published_at": "2026-04-07T20:03:52Z"
        },
        {
          "tag": "v1.5.5",
          "kind": "patch",
          "published_at": "2026-04-07T08:13:48Z"
        },
        {
          "tag": "v1.5.4",
          "kind": "patch",
          "published_at": "2026-04-07T05:04:52Z"
        },
        {
          "tag": "v1.5.3",
          "kind": "patch",
          "published_at": "2026-04-06T20:08:18Z"
        },
        {
          "tag": "v1.5.2",
          "kind": "patch",
          "published_at": "2026-04-06T19:44:14Z"
        },
        {
          "tag": "v1.5.1",
          "kind": "patch",
          "published_at": "2026-04-05T01:15:48Z"
        },
        {
          "tag": "v1.5.0",
          "kind": "minor",
          "published_at": "2026-04-04T20:48:51Z"
        },
        {
          "tag": "v1.4.12",
          "kind": "patch",
          "published_at": "2026-04-04T16:44:59Z"
        },
        {
          "tag": "v1.4.11",
          "kind": "patch",
          "published_at": "2026-04-04T16:30:15Z"
        },
        {
          "tag": "v1.4.10",
          "kind": "patch",
          "published_at": "2026-04-04T10:45:13Z"
        },
        {
          "tag": "v1.4.9",
          "kind": "patch",
          "published_at": "2026-04-04T10:37:36Z"
        },
        {
          "tag": "v1.4.8",
          "kind": "patch",
          "published_at": "2026-04-04T09:50:46Z"
        },
        {
          "tag": "v1.4.7",
          "kind": "patch",
          "published_at": "2026-04-04T06:40:55Z"
        },
        {
          "tag": "v1.4.6",
          "kind": "patch",
          "published_at": "2026-04-04T06:35:24Z"
        },
        {
          "tag": "v1.4.5",
          "kind": "patch",
          "published_at": "2026-04-04T04:14:21Z"
        },
        {
          "tag": "v1.4.4",
          "kind": "patch",
          "published_at": "2026-04-03T21:10:11Z"
        },
        {
          "tag": "v1.4.3",
          "kind": "patch",
          "published_at": "2026-04-03T20:49:07Z"
        },
        {
          "tag": "v1.4.2",
          "kind": "patch",
          "published_at": "2026-04-03T19:05:41Z"
        },
        {
          "tag": "v1.4.1",
          "kind": "patch",
          "published_at": "2026-04-03T18:53:46Z"
        },
        {
          "tag": "v1.4.0",
          "kind": "minor",
          "published_at": "2026-04-03T17:52:19Z"
        },
        {
          "tag": "v1.3.5",
          "kind": "patch",
          "published_at": "2026-04-03T10:01:39Z"
        },
        {
          "tag": "v1.0.1",
          "kind": "patch",
          "published_at": "2026-06-24T07:39:42Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "8021e4286533009b2b40b414c270807f928e42bf",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 2.4.1",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-07-17T08:17:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "db32df9878c8a54b425a249d1bcfe457ed6a8762",
          "body": "…loop for role-scoped loading\n\nController no longer reads core-loop.md; each role (controller/subagent/inline)\nloads only its files via the SKILL.md READ MAP.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(sp-build): extract controller-prep + test-command from core-…",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-07-17T08:17:22Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4ed4d1b418dc8d3c02313dba2fb6313d49ccb729",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 2.4.0",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-07-17T06:59:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e59af428e9555bcfdda800bb600ee8b28ca1feef",
          "body": "…es/orchestration/port); add token-discipline + story-size guard + typed signal markers; fix coverage-gate false-block & resume gap",
          "is_bot": false,
          "headline": "feat(sp-build): split into on-demand files (navigator + core-loop/gat…",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-07-17T06:59:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1b46f71464dc4c39c24fad990177c7d10229d7eb",
          "body": "…ility content)",
          "is_bot": false,
          "headline": "docs(changelog): add 2.3.1 entry (restored sp-build/sp-plan falsifiab…",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-07-06T06:51:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "62e167572fbc8daa4363cc20814f70e89a8250fc",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 2.3.1",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-07-06T06:50:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5ab43f576f356f64012aaa630992565d1d3a68f8",
          "body": "…uild/sp-plan\n\nPort the multi-clause constraint decomposition, per-clause falsifiability gate, and reject/accept boundary-pair rules from the installed skills back into the repo source. This content was authored directly against ~/.claude/skills on 2026-07-03 and never mirrored here, so 2.3.0 shipped an older sp-build/sp-plan. This restores it.",
          "is_bot": false,
          "headline": "fix(skills): restore Constraint-Clause Falsifiability content in sp-b…",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-07-06T06:50:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0258d5472ad394cfcf1453671c2ea1daace21f70",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 2.3.0",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-07-06T06:37:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3196b5e44e5d61886340a7da913a3d0362da6a2d",
          "body": "…cal skills\n\nOpenCode is now a supported --agents target (native .opencode/skills + ~/.config/opencode/skills). Canonical kit skills now carry an explicit name: field (Claude spec-compliant), so OpenCode/Cursor reading ~/.claude/skills stop silently skipping the sp-* skills.",
          "is_bot": false,
          "headline": "feat(agents): add OpenCode as install target + declare name in canoni…",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-07-06T06:37:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "537043a6fe78b858dce0ee839127eb06fc821ad4",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 2.2.0",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-07-02T19:54:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a026b5fdeec662052fb1e991576e7af3c3503413",
          "body": "- coverage axis caps the verdict; shallow / self-only maps now FAIL with insufficient coverage instead of reading PASS\n- gate painting extra nodes; never PASS on zero measured; divergence warning now gates the verdict\n- stop swallowing hover/focus failures (skip un-triggered states); wire --strict-s\n[…]\nl == 0\n- capture + diff accent-color, SVG fill/stroke, filter, box-sizing, outline-*\n- 7 new selftest cases + portable references/fidelity.demo\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(sp-port-webui): fidelity engine coverage-honesty + paint vocabulary",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-07-02T19:54:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0a74ed1237dde1cf10a30b945cc0156e2bab7bd5",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 2.1.2",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-07-02T15:29:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "525779f71fdac0b39893e5a410d13c5ced674c68",
          "body": "…rt-webui",
          "is_bot": false,
          "headline": "docs(skills): guide sp-build/sp-fix to hand visual-port work to sp-po…",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-07-02T15:29:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3bd023d6f496e651e14b473019b89c2f5e86262c",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 2.1.1",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-07-02T10:22:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "101c4094c8b19fc467a3064ff9ab9d5fe92c7a60",
          "body": null,
          "is_bot": false,
          "headline": "feat(skills): add sp-port-webui",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-07-02T10:22:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0a24d636c9fda978152a83d7fd2740b177c5d732",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 2.1.0",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-06-30T11:14:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "71cb4374c9a05165fab5bc6ff2df64842f0b5a38",
          "body": "Model the operation (entry points, internal seams, external/provider\ncontracts, invariants, optional/absent inputs, unknown semantics) before\nacceptance scenarios so seams and provider contracts aren't lost.\n\n- sp-explore: Phase 0.5 now Core Function Discovery; emits Core Function Model handoff\n- sp\n[…]\nFunction Model Gate + trace step in test design\n- sp-fix / sp-investigate: Core Function Mapping before fix/sibling discovery\n- sp-review: core model trace, provider contract drift, reference accuracy",
          "is_bot": false,
          "headline": "feat(sp): add Core Function Model across the spec-first pipeline",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-06-30T11:14:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1e302593f4c9926d3ee396cb45e5402697c0b604",
          "body": "Specpipe authors a disciplined loop (spec → code + tests → build pass) once and emits\nit as native skills, guard hooks, and project rules into whichever agent you run:\nClaude Code, Codex, Cursor, Antigravity, OpenClaw, Hermes.\n\nHighlights:\n- Multi-agent install (`init --agents <list>|all`) + interac\n[…]\ntracked skills are never touched.\n\nBREAKING CHANGE: package is `specpipe` (bin specpipe/sp); the self-review hook is removed;\nguards are now \"rules\"; per-agent layout. Migrate with `specpipe upgrade`.",
          "is_bot": false,
          "headline": "feat!: specpipe 2.0.0 — one spec-first workflow, every AI coding agent",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-06-30T06:44:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3d7547d38dadacfd15c416a2110a1a6c81636924",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): specpipe 1.0.1 — point npm homepage to landing site",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-06-24T07:39:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eace3f076fc2cd85f67f41b7473c0dbe763f79a3",
          "body": null,
          "is_bot": false,
          "headline": "chore: gitignore site/ (Vercel landing page, deployed separately)",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-06-24T06:01:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "db3822cf9f5ef0ca2219f7a354635b04ae2e9860",
          "body": "…nto docs/\n\n- README 1319 → 411 lines: keep philosophy, quick start, setup, workflows;\n  add compact command table + docs index\n- move per-skill reference, hooks, spec format, customization, troubleshooting,\n  FAQ into docs/*.md (verbatim)\n- fix FILE_GUARD_THRESHOLD default (350, matches code), dedupe Option D\n- neutralize Claude-specific phrasing in the quick-start transcript",
          "is_bot": false,
          "headline": "docs: restructure README into a lean landing page + split reference i…",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-06-24T06:01:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e986fe320da6acb93843ea94d3fb532be4bab2be",
          "body": "Final public OSS name: specpipe (npm + github.com/microvn/specpipe).\n- skills ap-* → sp-*; CLI command/bin ap→sp, agentpipe→specpipe\n- manifest dir .agentpipe/ → .specpipe/\n- guard files + rules + markers, cover wordmark, docs, shim dependency\n- all tests (78 + cli + hooks + coverage-gate) and lint green",
          "is_bot": false,
          "headline": "Rebrand agentpipe → specpipe",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-06-24T04:50:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2c6c932df29ea795f3fb3a5489ef1741131d3cb7",
          "body": "Preserve the existing claude-devkit-cli npm audience (~2.4k downloads/mo) across the\nrename to agentpipe instead of stranding them:\n\n- legacy/claude-devkit-cli/: a thin shim (v1.14.0) that depends on agentpipe@^1 and\n  forwards the claude-devkit / claude-devkit-cli commands to it, printing a rename\n\n[…]\naunch runbook (publish agentpipe → publish shim → `npm deprecate`\n  claude-devkit-cli) + ongoing release steps.\n\nShim verified locally: forwards --version/--help to agentpipe's CLI + shows the notice.",
          "is_bot": false,
          "headline": "build: legacy claude-devkit-cli redirect shim + release runbook",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-06-24T03:29:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7beb82fea266148c4136d2a1571447cf770973cc",
          "body": "Claude is no longer the only agent that enforces guards. Codex and Cursor get real\nblocking hooks (not just advisory rules):\n\n- Shared guard scripts kit/hooks/agentpipe-shell-guard.sh (blocks wasteful-dir\n  exploration + secret access in shell commands; reads .tool_input.command OR .command)\n  and a\n[…]\ngents/skills, Antigravity .agent/rules, enforcement tiers).\n\nGuard scripts unit-tested on both Codex- and Cursor-shaped payloads (block/allow).\nnpm test + lint green; all source files under 350 lines.",
          "is_bot": false,
          "headline": "feat: enforced (blocking) guard hooks for Codex and Cursor",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-06-23T03:14:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6c9fd06f89b30f6ab3625ba4d066302329e7623a",
          "body": "…aims\n\nResearch (cursor.com/docs, developers.openai.com/codex/hooks, agent repos) corrected\ntwo assumptions:\n\n- Cursor has NATIVE skills (.cursor/skills/<n>/SKILL.md, on-demand) — stop converting\n  skills into always-on .cursor/rules/*.mdc. Guards stay a .cursor/rules/*.mdc rule.\n  (Cursor also read\n[…]\ntill\n  emit advisory rules for them today; native hook-enforcement is now a tracked plan.\n  Docs/README/CHANGELOG updated to state this accurately (no more \"only agent\" claim).\n\nnpm test + lint green.",
          "is_bot": false,
          "headline": "fix(cursor): emit native .cursor/skills/ + correct the enforcement cl…",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-06-23T02:30:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6e798255562b2cb955d127b04f8ea94b5e283d9c",
          "body": "…refresh)\n\n- [M-1] init now accumulates agents: reads the existing manifest, unions its agents\n  with the requested ones, and records every installed agent's files — re-running\n  `init --agents X` then `--agents Y` keeps both instead of orphaning X. (mergeAgents)\n- [M-2] upgrade re-merges the Codex \n[…]\ned .agents/skills/ family.\n- Extract adoptExisting → init-adopt.js so all source files stay under the 350 guard.\n\nTests: +M-1 (accumulate + clean remove) +M-2 (upgrade refresh). npm test + lint green.",
          "is_bot": false,
          "headline": "fix: address mf-review findings (incremental install + upgrade rules …",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-06-23T01:50:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "863406c43bfbd6988f17b06d5eafd649a01ee7c9",
          "body": null,
          "is_bot": false,
          "headline": "chore: prune unused imports (eslint clean, 0 warnings)",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-06-22T17:10:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "efa89c9a46df1dd84517dd3000b235c52699e979",
          "body": "- installer.js (501→212): per-agent install → agent-install.js; Claude global\n  install (~/.claude skills/hooks/settings) → claude-global.js. Both re-exported\n  from installer.js so callers' imports are unchanged.\n- init.js (533→341): multi-agent install → init-agents.js; global install + manifest\n \n[…]\nw-unused imports.\n\nNo behavior change — every install/lifecycle path verified (default, --agents,\n--global, upgrade, remove). All source files now satisfy the kit's own 350-line guard.\nnpm test green.",
          "is_bot": false,
          "headline": "refactor: split installer.js and init.js under the 350-line guard",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-06-22T17:08:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e4a77cc82b0a167d444247b79e9654957a42b0cd",
          "body": "- Expand the shared rules source into full \"operating rules\" (spec-first cycle +\n  guardrails + testing discipline + conventions), so non-Claude agents get the same\n  project rules Claude gets via CLAUDE.md — not just the guard subset. Emitted as the\n  agent's always-on rule (Cursor .mdc, Antigravit\n[…]\nlaw/Hermes doc).\n- docs/architecture.md (artifact taxonomy, registry, emission pipeline, reconcile lifecycle).\n- docs/adding-an-agent.md (the one-entry extension recipe).\n\nnpm test green (all suites).",
          "is_bot": false,
          "headline": "feat: project-rules parity for non-Claude agents + architecture docs",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-06-22T16:55:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "efafd61a8f7d5e1f1b87101697e97c36148503f8",
          "body": "- LICENSE (MIT), CONTRIBUTING, CODE_OF_CONDUCT, SECURITY, CHANGELOG.\n- .editorconfig, ESLint flat config + Prettier; package.json scripts\n  (test aggregator, lint, format) + devDeps + repo/author metadata; version → 1.0.0.\n- GitHub Actions CI: test matrix (Node 18/20/22) + lint; issue/PR templates.\n- Fix test/coverage-gate.sh path after the kit/skills move (was kit/.claude/skills).\n- docs/oss-migration-plan.md as the living roadmap.\n\nAll four suites green via `npm test`.",
          "is_bot": false,
          "headline": "chore(oss): add OSS hygiene, CI, lint/format, and migration roadmap",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-06-22T16:50:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "85b0bfc4ddd4a92557abfa2e3c7bc24681a3891c",
          "body": "… formats\n\n- Move canonical skills to agent-neutral kit/skills/ (Claude is now one emit\n  target, not the privileged source). Output paths unchanged for Claude.\n- AskUserQuestion: rewrite Claude tool references in non-Claude variants into an\n  explicit \"plain-text multiple-choice question\" instructi\n[…]\n.agents/skills/ + AGENTS.md is a shared cross-tool standard (Codex + Antigravity).\n- README: multi-agent framing, Supported agents table, --agents install options.\n\nTests: 66 unit + cli + hooks green.",
          "is_bot": false,
          "headline": "feat: neutral skill template + capability adaptation + verified agent…",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-06-22T16:39:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5c02793a570624b9b0dd3b500d1714159a25aa2b",
          "body": "…text H1 for SEO",
          "is_bot": false,
          "headline": "docs(cover): fix connector gradient (userSpaceOnUse), top-left glow, …",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-06-22T09:11:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5a4d3c902b8b35b5701832af542fb2f738236d3b",
          "body": null,
          "is_bot": false,
          "headline": "docs(cover): move mint glow to bottom-right corner as ambient bloom",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-06-22T08:56:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "156a0f7c5d5f213cc469dbc4b854b21a823c9493",
          "body": null,
          "is_bot": false,
          "headline": "docs(cover): continuous-track stepper + restore mint background glow",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-06-22T08:54:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a4af6dd0595eb174ec2fd335e0a3b76657b0258e",
          "body": null,
          "is_bot": false,
          "headline": "docs(cover): drop misaligned chevrons, extend stepper connectors",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-06-22T08:40:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c2a8afd47b41b7de85be0d3fd26075e456520c74",
          "body": null,
          "is_bot": false,
          "headline": "docs(readme): add Agentpipe cover banner (spec→pass stepper, SVG)",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-06-22T08:39:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "087ca932ee3e10afdca7384c47360876cb8d4aae",
          "body": null,
          "is_bot": false,
          "headline": "docs(readme): center title as Agentpipe + cover banner slot",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-06-22T08:16:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ddda31fff0240a5acbd454bb9b61247b90df9453",
          "body": null,
          "is_bot": false,
          "headline": "docs: genericize residual \"Claude Code\" in WORKFLOW.md templates intro",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-06-22T08:08:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9c04620ed56643573d5ca4a7d5be346eb98f45c0",
          "body": "P3: non-Claude skill variants keep the body verbatim but gain a \"Running\noutside Claude Code\" section when the skill declares Claude-specific tools\nin allowed-tools — AskUserQuestion (ask in plain text), Agent/Task (run\ndelegated steps sequentially), mcp__graphatlas (fall back to grep). Skills\nwitho\n[…]\ns P2/P3 done.\nSkill bodies that genuinely describe Claude capabilities are left as-is —\nthe adaptation section explains the gap rather than rewriting them.\n\nTests: 171 cli + 203 hooks + 62 unit green.",
          "is_bot": false,
          "headline": "feat: capability adaptation (P3) + agent-neutral docs (P4)",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-06-22T07:20:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7808973496fa61c1485617db7b172a44a1f8904a",
          "body": "Claude keeps native hook enforcement; every other agent gets the same guard\nintent as an always-on rule, emitted from one canonical source\n(kit/rules/agentpipe-guards.md):\n\n- Cursor   -> .cursor/rules/agentpipe-guards.mdc (alwaysApply: true)\n- Antigravity -> .agents/rules/agentpipe-guards.md (trigge\n[…]\n\n\nOwned rule files flow through computeDesired, so upgrade/remove handle them.\ninit/list now state these are advisory (not hook-enforced) — the honest gap.\n\nTests: 171 cli + 203 hooks + 55 unit green.",
          "is_bot": false,
          "headline": "feat: per-agent guardrails (P2) — guards as always-on rules",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-06-22T07:16:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4afbd015eceed2d41e6e7e2abfe8a99202bb1515",
          "body": "upgrade/remove/diff/list are now agent-aware via a reconcile model: each\ncommand computes the desired installed state (computeDesired re-emits every\nagent's files) and reconciles against the manifest, instead of assuming the\nClaude .claude/ layout.\n\n- lib/reconcile.js: computeDesired(agents) + templ\n[…]\ngent layouts; diff/list: desired-state based, list groups by agent\n- init multi-agent records all emitted files in the manifest with hashes\n\nTests: 161 cli (+10 lifecycle) + 203 hooks + 42 unit green.",
          "is_bot": false,
          "headline": "feat: per-agent lifecycle + neutral manifest location",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-06-22T07:10:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e28350f90d0d25cab837126068b495f7b01f2a7c",
          "body": "Author skills once in canonical Claude form; emit per-agent variants on\ninstall (path + filename + frontmatter rewritten, body unchanged). New\nagent registry covers Claude, Antigravity, OpenClaw, Hermes, Codex, Cursor\nwith formats verified against each tool's docs/repos (see docs/multi-agent.md).\n\n-\n[…]\nion (cli.sh)\n\nBackward compatible: no --agents behaves exactly as before (203+138 tests green).\nP2 (per-agent hooks) and P3 (capability parity for Task/AskUserQuestion) tracked\nin docs/multi-agent.md.",
          "is_bot": false,
          "headline": "feat: multi-agent skill emitters + init --agents (P1 foundation)",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-06-22T06:35:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "22c48db87a57f2f749e41d5cb4768af4885f86ef",
          "body": "Rename CLI package and binary to agentpipe (alias: ap), and reprefix all\n13 skills from mf-* to ap-*. Broaden positioning from \"Claude Code\" to\n\"agentic AI coding agents\". Pure rename — all 203 tests still pass.",
          "is_bot": false,
          "headline": "chore: rebrand to agentpipe (claude-devkit-cli → agentpipe, mf-* → ap-*)",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-06-22T06:02:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "01633bd38c53a498c20f4b4e11be21b5761d4545",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 1.13.1",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-06-19T10:05:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "44af791e4dee11637bb3f7a3b1a55f12a65785c3",
          "body": "…o ASCII",
          "is_bot": false,
          "headline": "feat(mf-humanize): ban antithesis and normalize typographic unicode t…",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-06-19T10:05:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "daeae49064664407512a8b6fb01e94733dce258e",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 1.13.0",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-06-19T07:09:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e26668c56cc5041f89581e43dcf9ceabdf27a4c8",
          "body": "…m test coverage",
          "is_bot": false,
          "headline": "feat: greenfield scaffold skill + cross-surface invariant & FE-BE sea…",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-06-19T07:09:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eab0a032a562aa57597134aabec67fa24d992f6c",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 1.12.2",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-06-02T03:10:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3d6accfe494f1f33e889e63b9bfd098922de559f",
          "body": null,
          "is_bot": false,
          "headline": "feat(mf-plan): pin cross-spec linked fields + CC11 coverage check",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-06-02T03:10:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "74949c50dd89377738b11135135a901c292c7aa2",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 1.12.1",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-05-29T03:11:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "384d0b1454fa9ccb90968e6d4c414cf7a6d8c68a",
          "body": "Patch refined after voice round 2 (Codex + Gemini consensus on 5 fixes).\n\nmf-explore (UI sketches field):\n- Replaced free-form sketch guidance with structured E/N/X legend + bounded scan protocol\n- 'read' budget defined: ga_* summary = 0 reads, file_summary preview = 0.5, full read = 1, cap 7\n- 3-bl\n[…]\n> Prototype > UI Notes\n\nRisk addressed (voice consensus): false [E] from prototype-as-evidence or skipped verify, which would crash build. Evidence rule + scan discipline + [X] cap close that surface.",
          "is_bot": false,
          "headline": "feat: G10 — E/N/X legend + bounded UI codebase scan (extends G9)",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-05-29T03:11:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "52d6ba81b1dfc9a1d7a9744f52e6711cdbdc69c5",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 1.12.0",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-05-29T02:43:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e1631848a72169f4690d3c5781533d822a5be9a7",
          "body": "Adds a structured UI-mockup pipeline through the 3-skill family. Solves the gap where ASCII UI sketches user produces during /mf-explore are lost by /mf-plan (mapping previously folded UI expectation into AS prose, which the no-impl-vocab ban rejects markup from). Result: /mf-build had to guess UI s\n[…]\nA (inline) after clarifying ASCII lives in explore (for human visualization), Component Tree lives in spec (for build consumption) — mf-plan owns the translation per 'consumer owns the map' principle.",
          "is_bot": false,
          "headline": "feat: G9 — UI Notes channel across mf-explore/mf-plan/mf-build",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-05-29T02:43:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "702264b8d0f8fbc1f87949988f46a703f958a525",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 1.11.4",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-05-28T20:20:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a0f925eed4e42ec4eca953417d0e87dd3021d9a1",
          "body": "Skill v1.11.3 introduced G7 (G1-driven AS overage allowed up to 30/10 with justification trail) but the trail's destination was ambiguous — wording said 'in Phase 1 assessment' which has no slot in the Spec Template. Result: real /mf-plan runs put the trail in chat output only, leaving the spec file\n[…]\nen-to-include rule\n- Update G1-vs-T2/CC6 precedence wording: trail goes 'into the spec body's ## Spec Sizing Notes section'\n- Omit the section when stories ≤7 AND AS ≤20 (no overage = no trail needed)",
          "is_bot": false,
          "headline": "feat(mf-plan): G8 — G7 trail destination = Spec Sizing Notes section",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-05-28T20:20:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d58fc909e81cb9704f6292496cfb1742f3013f3d",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 1.11.3",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-05-28T20:05:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8af94b6db5c4022b1bd209b3b89283116bd54d18",
          "body": "G7: when G1 (no AS gộp) forces splitting and pushes count past 20, the new AS is NOT bloat — atom count unchanged. T2/CC6 reframed as soft targets: G1-driven overage up to 30 AS / 10 stories allowed when Phase 1 assessment carries justification trail. Hard cap at 30. Priority: G1 always wins > CC5 a\n[…]\nep 2 scope-by-layer\n- New subsection 'G1 vs T2/CC6 precedence' with justification trail format\n- Phase 2 CC6 row: soft target wording + G1-driven overage acceptance\n- Mode C CC6 row: sync with Phase 2",
          "is_bot": false,
          "headline": "feat(mf-plan): G7 G1-vs-T2/CC6 precedence + scope-by-layer split option",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-05-28T20:05:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "594cb11873c58854f240467088cc65c2b0167364",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 1.11.2",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-05-28T19:43:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "080457329df017e8ec1dee7c9748610e9a2273ba",
          "body": "…s, clean example output",
          "is_bot": false,
          "headline": "fix(mf-humanize): enforce em-dash ban on every return incl. follow-up…",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-05-28T19:43:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d4c63f17e9e416ad82d2fa1c5ae91822d0b6e9c1",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 1.11.1",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-05-28T18:56:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0aacc226435a76577f41b2fa39d37e725b844e57",
          "body": "G1: forcing-function against AS gộp (no or/Case A-B/mix transition+invariant; no Gap-shell AS)\nG2: CC5 list-and-tick procedure; each C-xxx now ends with explicit (AS-###) or (GAP-###); verify-line does not count\nG3: split-rule precedence — phase before sub-spec split when T1/T2 conflict T5/T6\nG4: ba\n[…]\nCC5 wording\n\nPlus Windows compat:\n- cli/src/commands/init.js: use 'where' on Windows, 'command -v' elsewhere\n- .gitattributes: lock LF for shell scripts + JS hooks (Git Bash on Windows breaks on CRLF)",
          "is_bot": false,
          "headline": "feat(mf-plan): G1-G6 rule tightening + Windows compat",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-05-28T18:56:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "547ca8a4aca27aeb625377e993dd9ee948f63a6e",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 1.11.0",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-05-27T20:01:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d2a9e939ec2f80d79c9f81ff875da58b3859fed1",
          "body": "Add test/coverage-gate.sh: deterministic checks of the gate's behaviour (block/partial/full/leading-zero/fail-safe) plus skill-text guards for the exact grep flags (-owE / -rowhE, no \\b) — two real bugs were caught here. Wire it into publish.sh so it runs before every publish.",
          "is_bot": false,
          "headline": "test(coverage-gate): regression test for the spec coverage gate",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-05-27T19:56:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "486e41bec4b267380351765e62da02d4ad72732d",
          "body": "When a commit implements a spec story, add a 'Story: S-NNN' footer so /mf-build's coverage gate and resume can find it via git log --grep. Optional — ordinary commits are unchanged.",
          "is_bot": false,
          "headline": "feat(mf-commit): optional Story footer for spec-story commits",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-05-27T19:56:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "da024878b4da42107db8ee6146f4feee42eae289",
          "body": "Add Auto-Mode: a controller dispatches one subagent per story (clean context, A1-A7), with worktree-isolated parallelism capped at 3 (scaling down by context tier), A4b branch integration + conflict fallback, building/done resume, and a dual gate (verification + spec-signal). Add Phase 3.5 Spec Cove\n[…]\nS/C IDs (tests embed the ID) — the actual coverage guarantee. Anchor the checklist on AS-NNN, not Then-nouns. Reframe the Edge Case Compliance Table as a depth forcing-function distinct from the gate.",
          "is_bot": false,
          "headline": "feat(mf-build): auto-mode orchestrator + deterministic coverage gate",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-05-27T19:56:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ba8b247777e13097c3c8638201091bdd07a123c4",
          "body": "Add an Execution block per story (depends_on/parallel_safe/files/autonomous/verify) so /mf-build can order, parallelize and dispatch. Add Scenario Derivation (trigger-gated classes, provenance via Source, gaps for triggered-but-unspecified behaviour) and CC7/CC8/CC9 (execution-block, DAG, provenance). GAP-NNN gains a mandatory status.",
          "is_bot": false,
          "headline": "feat(mf-plan): per-story execution metadata + honest AS derivation",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-05-27T19:55:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bf1ea671a6b0695385a52e52a7bee0222bcfced1",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 1.10.2",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-05-26T19:19:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bfa02cd57803d41c9a35d07fc0338bc141060ff5",
          "body": "…tive test command",
          "is_bot": false,
          "headline": "chore: remove redundant build-test.sh; mf-build/mf-fix auto-detect na…",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-05-26T19:19:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ee8b53e961a8db7e1d59ca19a908e6fa6fa000cf",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 1.10.1",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-05-26T19:07:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b2dbb890907ff47914cb3a02f5ff2c77eee5c2fb",
          "body": "…nd README integration section",
          "is_bot": false,
          "headline": "feat(skills): add GraphAtlas connectivity probe, on-demand reindex, a…",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-05-26T19:07:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "597150e2695753e3b91f4037ca0cbd0360e2347e",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 1.10.0",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-05-26T18:52:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4dc7f5551b59e2517243c35b70b3ec3acda944a2",
          "body": null,
          "is_bot": false,
          "headline": "feat(skills): add mf-humanize for rephrasing AI output to human voice",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-05-26T18:52:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "236ab43bb2b06b15e1cd8e279e6d66ea63f785dc",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 1.9.2",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-05-16T07:45:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "916c960875c3b443295d1a2d010d6b6b0d489f8c",
          "body": "- New /mf-md-render skill (SKILL.md + template.html + components.md)\n- Fix: mf-spec-render template.html/components.md were bundled into npm but never in installer manifest, so never installed on user machines\n- Wire docs: CLAUDE.md, WORKFLOW.md, README\n- test/cli.sh: assert aux skill files exist for both render skills",
          "is_bot": false,
          "headline": "feat(skills): add mf-md-render for generic markdown HTML view",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-05-16T07:45:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5962b06adb0d8eecffb8c6fcc04beeb84f25dadd",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 1.9.1",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-05-15T11:12:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c7540c867919505b6d2f311c04deca7a71f89108",
          "body": null,
          "is_bot": false,
          "headline": "fix(installer): add mf-spec-render to global skills sync list",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-05-15T11:12:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "de6014da5c00e17c93c5accbba69d4edf0bd695d",
          "body": null,
          "is_bot": false,
          "headline": "chore: ignore cli/README.md (npm publish artifact)",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-05-15T05:17:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "540a7ee048870673cf465bcdd6382bd2209170a1",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 1.9.0",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-05-15T05:12:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c64f0ae7265b3d2701101d193f50b621dc1e56a1",
          "body": null,
          "is_bot": false,
          "headline": "feat(skills): add mf-spec-render for HTML spec view",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-05-15T05:12:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7eace6d138555f952285d649ad41bf3fc6ac3330",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 1.8.11",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-05-03T17:22:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8679889fd723f6681dfb538761415fbab57c0904",
          "body": "…pawn",
          "is_bot": false,
          "headline": "fix(mf-voices): detect gemini CLI OAuth, stop forcing haiku in self-s…",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-05-03T17:22:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c229cc3668d6b7c40828697b183c53b21c88e94d",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 1.8.10",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-05-01T18:55:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c0b16ad125ff9af2167c0c220695dd2c1a87aef4",
          "body": null,
          "is_bot": false,
          "headline": "feat(mf-voices): add trust-folder bypass for codex and gemini CLI",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-05-01T18:55:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "42f4a1ab8e89c8e99ef41cf252f806a795f25796",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 1.8.9",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-05-01T18:49:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "01af85a7346a4fd52f6948b469a6bda0ba4ee46e",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 1.8.8",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-04-28T09:28:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cbd1fa02d69fe22121bc449f531b78285a29e6dd",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 1.8.7",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-04-27T17:04:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "46bf8ebdcfbd7d941ac63467e092fb51d6aeed9d",
          "body": "…eprecation",
          "is_bot": false,
          "headline": "update mf-voices model references — GPT 5.5, Gemini 3.1 Pro pricing/d…",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-04-27T17:04:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f2f8a29459f174b39d555d8fb2124025fd22df5c",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 1.8.6",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-04-27T16:40:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "514325535f85482371ef501df6fecc607bc378e4",
          "body": "…eout shim",
          "is_bot": false,
          "headline": "fix(mf-voices): update model IDs, fix codex/JSON injection, macOS tim…",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-04-27T16:40:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8719f7684ecf4429649a44f5d7911ee3675164c4",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 1.8.5",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-04-25T18:50:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6dce4ff65d3f628b094f4f7563f6410f7b8fa606",
          "body": null,
          "is_bot": false,
          "headline": "docs(skills): rewrite mf-* descriptions with proactive triggers",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-04-25T18:50:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "927b0ca81a3aaeced2ce80fff802eb310ee2c8cd",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 1.8.4",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-04-25T03:11:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "817ba824bc4695ec2f1b696d3f56e83e02290796",
          "body": "…ond-opinion handoff in /mf-review",
          "is_bot": false,
          "headline": "docs(mf-voices): introduce in WORKFLOW/README/CLAUDE.md and offer sec…",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-04-25T03:11:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ae199fa3fd9b95a26e40ec0a8932ee8f2f61ed6c",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 1.8.3",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-04-25T03:03:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4420a0fe9cd7b5a7db5ccdfb904c37fe9e90ee25",
          "body": null,
          "is_bot": false,
          "headline": "refactor(skills): update mf-voices skill content",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-04-25T03:03:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "006dc1aa13462da0d9492139450c7dfe8034976b",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 1.8.2",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-04-24T20:09:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c1ebeb811f87b91efd395ef7fc9a2d386e30baf5",
          "body": null,
          "is_bot": false,
          "headline": "feat(skills): add mf-voices multi-LLM review skill",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-04-24T20:09:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b2e6515fdfd820051e2ce6bacf6c8017b4900b7c",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 1.8.1",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-04-24T19:45:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a2dff6c7ea554dc2ab6c98cdd5d58a9587214e7a",
          "body": "…ions",
          "is_bot": false,
          "headline": "feat(mf-review): add interactive triage with bulk + per-finding decis…",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-04-24T19:45:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "86808a3b23afd929310265c45e40f6cebf78abf5",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 1.8.0",
          "author_name": "Microvn",
          "author_login": "microvn",
          "committed_at": "2026-04-22T01:52:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 67,
      "commits_last_year": 192,
      "latest_release_at": "2026-07-17T08:17:22Z",
      "latest_release_tag": "v2.4.1",
      "releases_from_tags": true,
      "days_since_last_push": 4,
      "active_weeks_last_year": 12,
      "days_since_latest_release": 4,
      "mean_days_between_releases": 3.1
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 100,
      "has_issue_template": false,
      "has_code_of_conduct": true,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "specpipe",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "ai",
            "ai-agents",
            "coding-agent",
            "claude-code",
            "codex",
            "cursor",
            "antigravity",
            "spec-first",
            "tdd",
            "skills",
            "guardrails",
            "developer-tools"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/specpipe",
          "is_deprecated": false,
          "latest_version": "2.4.1",
          "repository_url": "https://github.com/microvn/specpipe",
          "versions_count": 14,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 2543,
          "first_published_at": "2026-06-24T04:51:34.407000Z",
          "latest_published_at": "2026-07-17T08:17:29.586000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 4
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 2,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [
          {
            "date": "2026-06-30",
            "count": 2
          }
        ],
        "complete": true,
        "collected": 2,
        "total_stars": 2
      },
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": 49571,
      "source_files_sampled": 31,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "cli/package.json"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "@clack/prompts",
          "manifest": "cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.6.0"
        },
        {
          "name": "chalk",
          "manifest": "cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.4.1"
        },
        {
          "name": "commander",
          "manifest": "cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^13.1.0"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 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": "microvn",
          "commits": 192,
          "avatar_url": "https://avatars.githubusercontent.com/u/7679875?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        "eslint.config.js"
      ],
      "has_editorconfig": true,
      "has_linter_config": true,
      "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": null,
            "reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 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": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "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": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 10,
            "reason": "security policy file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 8,
            "reason": "2 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "8021e4286533009b2b40b414c270807f928e42bf",
        "ran_at": "2026-07-22T03:42:55Z",
        "aggregate_score": 3.8,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": true,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-17T08:18:03Z",
      "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/microvn/specpipe",
    "host": "github.com",
    "name": "specpipe",
    "owner": "microvn"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 57,
      "inputs": {
        "security": 39,
        "vitality": 72,
        "community": 47,
        "governance": 38,
        "engineering": 89
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 72,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 62,
            "inputs": {
              "commits_last_year": 192,
              "human_commit_share": 1,
              "days_since_last_push": 4,
              "active_weeks_last_year": 12
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 4 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "12/52 weeks with commits",
                "points": 8.3,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 12
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "192 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 192
                    }
                  }
                ],
                "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": 88,
            "inputs": {
              "releases_count": 67,
              "latest_release_tag": "v2.4.1",
              "releases_from_tags": true,
              "days_since_latest_release": 4,
              "mean_days_between_releases": 3.1
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "67 version tags (no GitHub releases)",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "version_tags_no_releases",
                    "params": {
                      "count": 67
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 4 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~3.1 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 3.1
                    }
                  }
                ],
                "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": 47,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 2,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "below_threshold"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "2 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "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": "excellent",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": true,
              "has_pull_request_template": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 13.5,
                "status": "met",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 6.3,
                "status": "met",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 57,
            "inputs": {
              "packages": [
                "specpipe"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 2543
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "2,543 downloads/month across npm",
                "points": 45.4,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 2543,
                      "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": 38,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 13,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "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": "moderate",
            "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": 54,
            "inputs": {
              "followers": 13,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "microvn",
              "public_repos": 117,
              "account_age_days": 4442
            },
            "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": "13 followers of microvn",
                "points": 8.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 13,
                      "login": "microvn"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "117 public repos, account ~12 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 117
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 12
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "specpipe"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 4
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 4 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "14 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 14
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "excellent",
        "name": "Engineering Quality",
        "value": 89,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "excellent",
            "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": 88,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": true,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "1 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": "eslint.config.js",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "eslint.config.js"
                    }
                  }
                ],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 6.4,
                "status": "met",
                "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": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": "https://specpipe.vercel.app",
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://specpipe.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": "at_risk",
        "name": "Security",
        "value": 39,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Branch-Protection, CI-Tests, Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection",
                    "ci_tests",
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 39,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 14,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 4,
              "scorecard_aggregate": 3.8
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "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 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "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 not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "2 existing vulnerabilities detected",
                "points": 6,
                "status": "partial",
                "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": "at_risk",
        "name": "AI Readiness",
        "value": 45,
        "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.99,
              "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": "99 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 99,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "at_risk",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 47,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 0.02,
              "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": "eslint.config.js",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "eslint.config.js"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": "2 of the last 100 commits agent-authored or agent-credited",
                "points": 4,
                "status": "partial",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 2,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "moderate",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "primary_language": "JavaScript",
              "largest_source_bytes": 49571,
              "source_files_sampled": 31,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "JavaScript without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "JavaScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/31 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 31,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index npm:specpipe@2.4.1; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-22T03:42:59.692802Z",
  "schema_version": "0.26.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/m/microvn/specpipe.svg",
  "full_name": "microvn/specpipe",
  "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.26.0 — metodología completa · wiki de métricas.

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