Öffentliches Register
Software-GesundheitsberichtSchema 0.26.0 · Metriken 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 Sterne⑂ 0 Forksseit Juni 2026Auf GitHub ansehen ↗

microvn/specpipe erreicht einen Gesundheitsindex von 57 von 100 und liegt damit im Bereich Mittel. Am stärksten schneidet es bei Engineering Quality (89/100) ab, am schwächsten bei Sustainability & Governance (38/100). Zuletzt vor 4 Tagen aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

57
gesamt / 100
Mittel

Software-Gesundheitsindex

Metriken werden auf einer Skala von 1–100 in gewichtete Kategorien gruppiert. Der Gesamtwert beginnt als ihr Mittel; sobald öffentliche Evidenz die Richtlinie für Hochrisikojurisdiktionen auslöst, wird die Bewertung angepasst und erhält die Obergrenze 49 (Gefährdet). AI Readiness liegt außerhalb.

57
Exzellent85-100Vorbildlich; erfüllt im Wesentlichen alle geprüften Kriterien
Gut70-84Gesund; geringfügige Lücken
Mittel50-69Akzeptabel mit deutlichen Lücken; Überprüfung empfohlen
Gefährdet30-49Erhebliche Schwächen; eine Übernahme erfordert Vorsicht
Kritisch1-29Schwerwiegende Probleme (aufgegeben, nur ein Maintainer, keine Hygiene)
VitalitätCommunity &VerbreitungNachhaltigkeit &GovernanceEngineering-QualitätSicherheitAI Readiness

Bewertungsprofil

Jede Achse ist eine Kategorie. Die Form zählt mehr als der Durchschnitt — ein gesundes Projekt füllt die gesamte Fläche, während ein Profil aus Spitzen und Kratern bedeutet, dass Stärke in einer Dimension Risiken in einer anderen verdeckt.

Eigentümerschaft

microvnPersönliches Konto
13 Follower117 öffentliche Reposseit Mai 2014OkLabel

Dieses Repository gehört einem persönlichen Konto. Ein Projekt mit nur einem Eigentümer trägt ein höheres Kontinuitätsrisiko als ein organisationsgetragenes.

Paket-Ökosysteme

RegistryPaketVersionDownloads / MonatVersionenZuletzt veröffentlichtTags
npmspecpipe2.4.12.54314vor 4 Tagenaiai-agentscoding-agentclaude-codecodexcursorantigravityspec-firsttddskillsguardrailsdeveloper-tools

Metriken nach Kategorie

Vitalität

Lebt das Projekt — wird Code geschrieben und werden Releases ausgeliefert?

72Gut · 22 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 4 Tagen
8.3/36Commit-Rhythmus — 12/52 Wochen mit Commits
18/18Commit-Volumen — 192 Commits im letzten Jahr
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Verwendete Eingangsdaten
commits_last_year192
human_commit_share1
days_since_last_push4
active_weeks_last_year12
Wie die Bewertung erfolgt
16.2/27Liefert Releases aus — 67 Versions-Tags (keine GitHub-Releases)
36/36Release-Aktualität — letztes Release vor 4 Tagen
27/27Release-Rhythmus — ein Release etwa alle 3,1 Tage
0/10OpenSSF Scorecard: Signed-Releases — keine Daten
Verwendete Eingangsdaten
releases_count67
latest_release_tagv2.4.1
releases_from_tagsja
days_since_latest_release4
mean_days_between_releases3,1
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: Signed-Releases. Die verbleibenden Gewichte wurden renormalisiert.

Community & Verbreitung

Hat das Projekt Nutzer, Downloads, Aufmerksamkeit und ein einladendes Umfeld für Beitragende?

47Gefährdet · 18 % des Gesamtindex
Wie die Bewertung erfolgt
0/60Stars — 2 Stars
0/25Forks — 0 Forks
0/15Watcher — 0 Watcher
Verwendete Eingangsdaten
forks0
stars2
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonbelow_threshold
Wie die Bewertung erfolgt
22.5/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (MIT)
18/18CONTRIBUTING-Leitfaden
13.5/13.5Verhaltenskodex
0/7.2Issue-Vorlage
6.3/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
has_contributingja
has_issue_templatenein
has_code_of_conductja
has_pull_request_templateja
Wie die Bewertung erfolgt
45.4/80Downloads pro Monat — 2.543 Downloads/Monat über npm
0/20Abhängige in der Registry — von diesem Ökosystem nicht ausgewiesen
Verwendete Eingangsdaten
packagesspecpipe
dependents
ecosystemsnpm
total_downloads
monthly_downloads2.543
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Abhängige in der Registry. Die verbleibenden Gewichte wurden renormalisiert.

Nachhaltigkeit & Governance

Überdauert das Projekt die Menschen, die es tragen — Bus-Faktor, Reaktionsfähigkeit, Trägerschaft und Paketpflege?

38Gefährdet · 24 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
0/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 100 % der Commits
1.4/13.5Breite der Beitragenden — 1 Beitragende
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Verwendete Eingangsdaten
bus_factor1
contributors_sampled1
top_contributor_share1
Wie die Bewertung erfolgt
0/46.8Issue-Lösungsquote — keine Issues oder keine Daten
0/38.3PR-Annahme — keine entschiedenen Pull Requests oder keine Daten
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Verwendete Eingangsdaten
merged_prs0
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Issue-Lösungsquote, PR-Annahme. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
10/30Organisatorische Trägerschaft — persönliches (Nutzer-)Konto
0/20Verifizierte Domain — für Nutzerkonten nicht anwendbar
8.2/25Reichweite des Inhabers — 13 Follower von microvn
25/25Kontohistorie — 117 öffentliche Repos, Kontoalter ca. 12 Jahre
Verwendete Eingangsdaten
followers13
owner_typeUser
is_verified
owner_loginmicrovn
public_repos117
account_age_days4.442
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Verifizierte Domain. Die verbleibenden Gewichte wurden renormalisiert.

Paketpflege

100Exzellent
Wie die Bewertung erfolgt
25/25Veröffentlicht & auflösbar — 1 Paket(e) auf npm
35/35Veröffentlichungsaktualität — letzte Veröffentlichung vor 4 Tagen
20/20Versionshistorie — 14 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packagesspecpipe
ecosystemsnpm
any_deprecatednein
min_days_since_publish4

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

89Exzellent · 20 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 1 Workflow(s)
24/24Tests vorhanden
16/16Linter-Konfiguration — eslint.config.js
0/9.6Pre-Commit-Hooks
6.4/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — keine Daten
Verwendete Eingangsdaten
has_cija
has_testsja
has_editorconfigja
has_linter_configja
has_precommit_confignein
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: CI-Tests. Die verbleibenden Gewichte wurden renormalisiert.

Dokumentation

90Exzellent
Wie die Bewertung erfolgt
30/30README
25/25Dokumentationsverzeichnis
15/15Dokumentations-/Homepage-Site — https://specpipe.vercel.app
10/10Repository-Beschreibung
0/10Topics
10/10Wiki
Verwendete Eingangsdaten
topics
has_wikija
homepagehttps://specpipe.vercel.app
has_readmeja
has_docs_dirja
has_descriptionja

Sicherheit

Sind die sichtbaren Sicherheits- und Lieferkettenpraktiken belastbar, ohne ungeklärte Exposition gegenüber Hochrisikojurisdiktionen?

39Gefährdet · 16 % des Gesamtindex

Sicherheitslage

39Gefährdet
Wie die Bewertung erfolgt
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — keine Daten
0/2.5CI-Tests — keine Daten
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.5Lizenz — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — keine Daten
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 — keine Daten
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
6/7.5Vulnerabilities — 2 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated14
scorecard_versionv5.5.0
checks_inconclusive4
scorecard_aggregate3,8
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): branch_protection, ci_tests, packaging, signed_releases. Die verbleibenden Gewichte wurden renormalisiert.

AI Readiness

Wie gut ist das Repository dafür ausgestattet, mit KI-Coding-Agenten entwickelt und gepflegt zu werden? Ein unabhängiges, experimentelles Badge — Gewicht 0,0, es wird eigenständig ausgewiesen und verändert den Gesamt-Gesundheitswert nicht.

45Gefährdet · 0 % des Gesamtindex
Wie die Bewertung erfolgt
0/45Agentenanweisungen — keine CLAUDE.md / AGENTS.md / Editor-Regeln
0/15Maschinenlesbare Doku (llms.txt)
40/40Lesbare Commit-Historie — 99 von 100 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share0,99
agent_instruction_files
agent_instruction_max_bytes
Wie die Bewertung erfolgt
0/18Bootstrap mit einem Befehl
22/22Automatisierte Tests
11/11Lint-/Format-Konfiguration — eslint.config.js
0/11Statische Typprüfung
10/10Reproduzierbare Umgebung — lockfile
4/10Belegte Agentenpraxis — 2 der letzten 100 Commits von Agenten verfasst oder ihnen zugeschrieben
0/8Automatisierte Wartung — keine automatisierten Abhängigkeits-Updates beobachtet
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfilespackage-lock.json
has_dockerfilenein
typed_languagenein
bootstrap_files
has_devcontainernein
has_linter_configja
typecheck_configs
agent_commit_share0,02
toolchain_manifests
dependency_bot_commit_share0
Wie die Bewertung erfolgt
0/45Typprüfbarer Code — JavaScript ohne Typprüfungs-Konfiguration
55/55Handhabbare Dateigrößen — 0/31 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languageJavaScript
largest_source_bytes49.571
source_files_sampled31
oversized_source_files0
Wie die Bewertung erfolgt
0/40API-Schema (OpenAPI/GraphQL/proto)
0/20MCP-Server
40/40Lauffähige Beispiele — examples
Verwendete Eingangsdaten
example_dirsexamples
has_mcp_signalnein
api_schema_files

Eckdaten

2GitHub-Sterne
1Mitwirkende
192Commits, letzte 12 Monate
4Tage seit letztem Push
67Releases
1Bus-Faktor
0offene Issues
npmPaket-Ökosysteme

Warnungen zur Datenerhebung

  • 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

Weitere Details

OpenSSF Scorecard 3.8 / 10
3.8Gesamtwert

Unabhängige, werkzeugneutrale Sicherheitsbewertung durch das quelloffene OpenSSF Scorecard. Jede Prüfung honoriert eine Sicherheits-Praxis, nicht das Werkzeug eines bestimmten Anbieters. Prüfungen, die Scorecard nicht ermitteln konnte, sind mit k. A. markiert und vom Sicherheitswert ausgeschlossen (nie als null gezählt).Scorecard v5.5.0 · 2026-07-22 03:42 UTC

10Binary-Artifactsno binaries found in the repo
k. A.Branch-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
k. A.CI-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
k. A.Packagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTno SAST tool detected
10Security-Policysecurity policy file detected
k. A.Signed-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
8Vulnerabilities2 existing vulnerabilities detected
Direkte Abhängigkeiten 3
RegistryPaketVersionsvorgabeManifest
npm@clack/prompts^1.6.0cli/package.json
npmchalk^5.4.1cli/package.json
npmcommander^13.1.0cli/package.json
Alle Abhängigkeiten nicht erhoben

Der aufgelöste Abhängigkeitssatz konnte für diesen Bericht nicht erhoben werden: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

JSON-Rohbericht maschinenlesbar
{
  "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"
}

Bewertungen sind Signale, keine Garantien. Sie spiegeln öffentlich sichtbare Praxis auf GitHub wider — kein Code-Audit und keine Sicherheitsgarantie.

Fehlende Daten werden ausgeschlossen und die Gewichte neu normiert, nie als null bewertet. Die Methodik ist versioniert und offen: Metriken v1.13.0, Schema v0.26.0 — vollständige Methodik · Metriken-Wiki.

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte Statistikennpm.