Öffentliches Register
Software-GesundheitsberichtSchema 0.26.0 · Metriken 1.13.0 · 2026-07-22 02:06 UTC

animeshkundu / github-router

Power Claude Code, Codex CLI, and more with your Copilot subscription.

TypeScriptMIT★ 4 Sterne⑂ 0 Forksseit Feb. 2026Auf GitHub ansehen ↗

animeshkundu/github-router erreicht einen Gesundheitsindex von 62 von 100 und liegt damit im Bereich Mittel. Am stärksten schneidet es bei Vitality (86/100) ab, am schwächsten bei Community & Adoption (27/100). Zuletzt vor 4 Tagen aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

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

62
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

AnimeshPersönliches Konto
40 Follower35 öffentliche Reposseit Apr. 2014@Microsoft

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
npm@animeshkundu/github-router0.3.10434vor 138 Tagenproxygithub-copilotopenai-compatibleanthropic-compatibleclaude-codecodexreverse-proxycopilot

Metriken nach Kategorie

Vitalität

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

86Exzellent · 22 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 4 Tagen
11.8/36Commit-Rhythmus — 17/52 Wochen mit Commits
18/18Commit-Volumen — 102 Commits im letzten Jahr
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Verwendete Eingangsdaten
commits_last_year102
human_commit_share1
days_since_last_push4
active_weeks_last_year17

Release-Disziplin

100Exzellent
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 83 Releases veröffentlicht
36/36Release-Aktualität — letztes Release vor 4 Tagen
27/27Release-Rhythmus — ein Release etwa alle 1,1 Tage
0/10OpenSSF Scorecard: Signed-Releases — keine Daten
Verwendete Eingangsdaten
releases_count83
latest_release_tagv0.3.212
releases_from_tagsnein
days_since_latest_release4
mean_days_between_releases1,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?

27Kritisch · 18 % des Gesamtindex
Wie die Bewertung erfolgt
7.7/60Stars — 4 Stars
0/25Forks — 0 Forks
0/15Watcher — 0 Watcher
Verwendete Eingangsdaten
forks0
stars4
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)
0/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
0/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
has_contributingnein
has_issue_templatenein
has_code_of_conductnein
has_pull_request_templatenein
Wie die Bewertung erfolgt
21.9/80Downloads pro Monat — 43 Downloads/Monat über npm
0/20Abhängige in der Registry — von diesem Ökosystem nicht ausgewiesen
Verwendete Eingangsdaten
packages@animeshkundu/github-router
dependents
ecosystemsnpm
total_downloads
monthly_downloads43
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?

57Mittel · 24 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
0.8/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 96 % der Commits
2.7/13.5Breite der Beitragenden — 2 Beitragende
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Verwendete Eingangsdaten
bus_factor1
contributors_sampled2
top_contributor_share0,965
Wie die Bewertung erfolgt
46.8/46.8Issue-Lösungsquote — 100 % der Issues geschlossen
34.5/38.3PR-Annahme — 82/91 entschiedene PRs gemergt
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Verwendete Eingangsdaten
merged_prs82
open_issues0
closed_issues1
issue_closed_ratio1
closed_unmerged_prs9
Wie die Bewertung erfolgt
10/30Organisatorische Trägerschaft — persönliches (Nutzer-)Konto
0/20Verifizierte Domain — für Nutzerkonten nicht anwendbar
11.6/25Reichweite des Inhabers — 40 Follower von animeshkundu
23.3/25Kontohistorie — 35 öffentliche Repos, Kontoalter ca. 12 Jahre
Verwendete Eingangsdaten
followers40
owner_typeUser
is_verified
owner_loginanimeshkundu
public_repos35
account_age_days4.485
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Verifizierte Domain. Die verbleibenden Gewichte wurden renormalisiert.

Paketpflege

92Exzellent
Wie die Bewertung erfolgt
25/25Veröffentlicht & auflösbar — 1 Paket(e) auf npm
35/35Veröffentlichungsaktualität — letzte Veröffentlichung vor 138 Tagen
12/20Versionshistorie — 4 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packages@animeshkundu/github-router
ecosystemsnpm
any_deprecatednein
min_days_since_publish138

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

86Exzellent · 20 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 3 Workflow(s)
24/24Tests vorhanden
16/16Linter-Konfiguration — eslint.config.js
0/9.6Pre-Commit-Hooks
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 27 out of 27 merged PRs checked by a CI test -- score normalized to 10
Verwendete Eingangsdaten
has_cija
has_testsja
has_editorconfignein
has_linter_configja
has_precommit_confignein

Dokumentation

90Exzellent
Wie die Bewertung erfolgt
30/30README
25/25Dokumentationsverzeichnis
15/15Dokumentations-/Homepage-Site — https://animesh.kundus.in/github-router/
10/10Repository-Beschreibung
10/10Topics — 8 Topics
0/10Wiki
Verwendete Eingangsdaten
topicsanthropic, claude-code, github-copilot, openai, proxy, claude-cli, codex, codex-cli
has_wikinein
homepagehttps://animesh.kundus.in/github-router/
has_readmeja
has_docs_dirja
has_descriptionja

Sicherheit

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

46Gefährdet · 16 % des Gesamtindex

Sicherheitslage

37Gefährdet
Wie die Bewertung erfolgt
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
2.5/2.5CI-Tests — 27 out of 27 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/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
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — keine Daten
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 26 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate3,7
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): signed_releases. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
21.6/35Direkte Abhängigkeiten ohne bekannte Advisories — 1 betroffen: srvx 0.8.16 (moderate 4.8)
25/25Indirekte Abhängigkeiten ohne bekannte Advisories — keine indirekte Abhängigkeit trägt ein bekanntes Advisory
35.7/40Keine offenen Advisories — 1 Paket(e) mit Advisory seit über 90 Tagen unbehandelt; ältestes vor 117 Tagen veröffentlicht
Verwendete Eingangsdaten
sourceosv
advisories1
affected_packages1
assessed_packages60
unassessed_packages0
affected_by_severitymoderate 1
direct_affected_packages1
Abgeglichen wurde die Laufzeit-Abhängigkeitshülle von npm:@animeshkundu/github-router@0.3.10 — das, was die Installation des veröffentlichten Pakets nach sich zieht — mit 60 Paketen. Erreichbarkeit wird nicht analysiert.

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.

66Mittel · 0 % des Gesamtindex
Wie die Bewertung erfolgt
45/45Agentenanweisungen — AGENTS.md, CLAUDE.md
0/15Maschinenlesbare Doku (llms.txt)
40/40Lesbare Commit-Historie — 94 von 100 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share0,94
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes79.799
Wie die Bewertung erfolgt
0/18Bootstrap mit einem Befehl
22/22Automatisierte Tests
11/11Lint-/Format-Konfiguration — eslint.config.js
11/11Statische Typprüfung — tsconfig.json
10/10Reproduzierbare Umgebung — Dockerfile
2/10Belegte Agentenpraxis — 1 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
lockfiles
has_dockerfileja
typed_languageja
bootstrap_files
has_devcontainernein
has_linter_configja
typecheck_configstsconfig.json
agent_commit_share0,01
toolchain_manifests
dependency_bot_commit_share0
Wie die Bewertung erfolgt
45/45Typprüfbarer Code — TypeScript (statisch typisiert)
53.2/55Handhabbare Dateigrößen — 16/496 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languageTypeScript
largest_source_bytes139.191
source_files_sampled496
oversized_source_files16
Wie die Bewertung erfolgt
0/40API-Schema (OpenAPI/GraphQL/proto)
20/20MCP-Server
0/40Lauffähige Beispiele
Verwendete Eingangsdaten
example_dirs
has_mcp_signalja
api_schema_files

Eckdaten

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

Weitere Details

Stern- und Fork-Verlauf 4 ★ / 0 ⇿
4Sterne
58Releases

Wann jeder Stern und Fork hinzugefügt wurde, von GitHub erfasst und nach Tagen gruppiert. Das kumulierte Wachstum steht direkt über den täglichen Zugängen, aus denen es besteht, sodass beide gegeneinander lesbar sind: stetiger organischer Zuwachs sieht ganz anders aus als ein abrupter, kurzlebiger Ausschlag. Wo dieser Unterschied messbar ist, wird er als Wachstumsauthentizität ausgewiesen.

1223344422026-052026-062026-07
Major 0Minor 0Patch 58
OpenSSF Scorecard 3.7 / 10
3.7Gesamtwert

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 02:06 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests27 out of 27 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/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
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
k. A.Signed-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities26 existing vulnerabilities detected
Direkte Abhängigkeiten 19
RegistryPaketVersionsvorgabeManifest
npm@vscode/ripgrep^1.18.0package.json
npmcitty^0.1.6package.json
npmclipboardy^5.3.1package.json
npmconsola^3.4.2package.json
npmfetch-event-stream^0.1.6package.json
npmgpt-tokenizer^3.4.0package.json
npmhono^4.12.23package.json
npmignore7.0.5package.json
npmmarked^18.0.5package.json
npmpartial-json0.1.7package.json
npmproxy-from-env^1.1.0package.json
npmsrvx^0.8.16package.json
npmtree-sitter-wasms^0.1.13package.json
npmtypebox1.1.38package.json
npmundici^7.27.0package.json
npmweb-tree-sitter0.22.6package.json
npmws^8.21.0package.json
npmyaml2.9.0package.json
npmzod^4.4.3package.json
Alle Abhängigkeiten 33

Vollständig aufgelöster Abhängigkeitssatz aus dem GitHub-Abhängigkeitsgraphen: 19 direkte und 14 indirekte (transitive) Pakete. Die transitive Hülle ist vollständig, wenn das Repository eine Lockfile eincheckt.

RegistryPaketVersionBeziehung
npm@vscode/ripgrep^1.18.0direkt
npmcitty^0.1.6direkt
npmclipboardy^5.3.1direkt
npmconsola^3.4.2direkt
npmfetch-event-stream^0.1.6direkt
npmgpt-tokenizer^3.4.0direkt
npmhono^4.12.23direkt
npmignore7.0.5direkt
npmmarked^18.0.5direkt
npmpartial-json0.1.7direkt
npmproxy-from-env^1.1.0direkt
npmsrvx^0.8.16direkt
npmtree-sitter-wasms^0.1.13direkt
npmtypebox1.1.38direkt
npmundici^7.27.0direkt
npmweb-tree-sitter0.22.6direkt
npmws^8.21.0direkt
npmyaml2.9.0direkt
npmzod^4.4.3direkt
npm@eslint/js^9.39.4indirekt
npm@types/bun^1.3.14indirekt
npm@types/proxy-from-env^1.0.4indirekt
npm@types/ws^8.18.1indirekt
npmeslint^9.39.4indirekt
npmeslint-config-prettier^10.1.8indirekt
npmknip^5.88.1indirekt
npmlint-staged^16.4.0indirekt
npmplaywright^1.60.0indirekt
npmprettier-plugin-packagejson^2.5.22indirekt
npmsimple-git-hooks^2.13.1indirekt
npmtsdown^0.15.12indirekt
npmtypescript^5.9.3indirekt
npmtypescript-eslint^8.60.1indirekt
Abhängigkeits-Advisories 1

Die Installation von npm:@animeshkundu/github-router@0.3.10 zieht 60 Pakete nach sich, direkt und transitiv: 1 tragen bekannte Advisories, davon 1 direkte Abhängigkeiten.

PaketVersionBeziehungSchweregradAdvisoriesBehoben in
srvx0.8.16direktmittel10.11.13

Ein Advisory bedeutet, dass die im Abhängigkeitsgraphen erfasste Version in den betroffenen Bereich eines Advisories fällt. Erreichbarkeit wird nicht analysiert, und der Graph enthält Entwicklungs- und Test-Pins — ein Fund kann das Werkzeug betreffen und nicht die ausgelieferte Software.

JSON-Rohbericht maschinenlesbar
{
  "data": {
    "repo": {
      "topics": [
        "anthropic",
        "claude-code",
        "github-copilot",
        "openai",
        "proxy",
        "claude-cli",
        "codex",
        "codex-cli"
      ],
      "is_fork": false,
      "size_kb": 7206,
      "has_wiki": false,
      "homepage": "https://animesh.kundus.in/github-router/",
      "languages": {
        "HTML": 44646,
        "Shell": 68280,
        "Batchfile": 495,
        "Dockerfile": 592,
        "JavaScript": 164203,
        "TypeScript": 6017725
      },
      "pushed_at": "2026-07-17T22:44:28Z",
      "created_at": "2026-02-09T23:26:12Z",
      "owner_type": "User",
      "updated_at": "2026-07-17T05:24:12Z",
      "description": "Power Claude Code, Codex CLI, and more with your Copilot subscription.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "master",
      "license_spdx_raw": "MIT",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript"
      ]
    },
    "owner": {
      "blog": "https://animesh.kundus.in",
      "name": "Animesh",
      "type": "User",
      "login": "animeshkundu",
      "company": "@Microsoft",
      "location": "Seattle",
      "followers": 40,
      "avatar_url": "https://avatars.githubusercontent.com/u/7248674?v=4",
      "created_at": "2014-04-10T08:30:39Z",
      "is_verified": null,
      "public_repos": 35,
      "account_age_days": 4485
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.3.212",
          "kind": "patch",
          "published_at": "2026-07-17T05:29:58Z"
        },
        {
          "tag": "v0.3.211",
          "kind": "patch",
          "published_at": "2026-07-15T11:37:02Z"
        },
        {
          "tag": "v0.3.206",
          "kind": "patch",
          "published_at": "2026-07-15T10:27:39Z"
        },
        {
          "tag": "v0.3.204",
          "kind": "patch",
          "published_at": "2026-07-12T11:16:58Z"
        },
        {
          "tag": "v0.3.202",
          "kind": "patch",
          "published_at": "2026-07-12T09:20:37Z"
        },
        {
          "tag": "v0.3.178",
          "kind": "patch",
          "published_at": "2026-07-11T21:25:29Z"
        },
        {
          "tag": "v0.3.177",
          "kind": "patch",
          "published_at": "2026-07-10T11:21:13Z"
        },
        {
          "tag": "v0.3.176",
          "kind": "patch",
          "published_at": "2026-07-10T08:29:48Z"
        },
        {
          "tag": "v0.3.175",
          "kind": "patch",
          "published_at": "2026-07-09T07:39:10Z"
        },
        {
          "tag": "v0.3.168",
          "kind": "patch",
          "published_at": "2026-07-07T08:34:25Z"
        },
        {
          "tag": "v0.3.163",
          "kind": "patch",
          "published_at": "2026-07-06T13:02:14Z"
        },
        {
          "tag": "v0.3.162",
          "kind": "patch",
          "published_at": "2026-07-06T01:57:44Z"
        },
        {
          "tag": "v0.3.153",
          "kind": "patch",
          "published_at": "2026-07-05T06:19:04Z"
        },
        {
          "tag": "v0.3.152",
          "kind": "patch",
          "published_at": "2026-07-04T02:10:36Z"
        },
        {
          "tag": "v0.3.151",
          "kind": "patch",
          "published_at": "2026-07-04T00:11:42Z"
        },
        {
          "tag": "v0.3.150",
          "kind": "patch",
          "published_at": "2026-07-02T07:48:23Z"
        },
        {
          "tag": "v0.3.138",
          "kind": "patch",
          "published_at": "2026-07-01T11:11:40Z"
        },
        {
          "tag": "v0.3.137",
          "kind": "patch",
          "published_at": "2026-07-01T02:50:12Z"
        },
        {
          "tag": "v0.3.136",
          "kind": "patch",
          "published_at": "2026-07-01T00:18:59Z"
        },
        {
          "tag": "v0.3.135",
          "kind": "patch",
          "published_at": "2026-06-30T01:02:55Z"
        },
        {
          "tag": "v0.3.131",
          "kind": "patch",
          "published_at": "2026-06-29T11:21:05Z"
        },
        {
          "tag": "v0.3.130",
          "kind": "patch",
          "published_at": "2026-06-29T00:23:08Z"
        },
        {
          "tag": "v0.3.129",
          "kind": "patch",
          "published_at": "2026-06-28T20:24:50Z"
        },
        {
          "tag": "v0.3.126",
          "kind": "patch",
          "published_at": "2026-06-28T09:25:30Z"
        },
        {
          "tag": "v0.3.122",
          "kind": "patch",
          "published_at": "2026-06-27T00:47:34Z"
        },
        {
          "tag": "v0.3.121",
          "kind": "patch",
          "published_at": "2026-06-21T02:36:18Z"
        },
        {
          "tag": "v0.3.118",
          "kind": "patch",
          "published_at": "2026-06-20T06:57:30Z"
        },
        {
          "tag": "v0.3.117",
          "kind": "patch",
          "published_at": "2026-06-18T05:48:07Z"
        },
        {
          "tag": "v0.3.111",
          "kind": "patch",
          "published_at": "2026-06-16T12:34:57Z"
        },
        {
          "tag": "v0.3.110",
          "kind": "patch",
          "published_at": "2026-06-16T12:24:53Z"
        },
        {
          "tag": "v0.3.87",
          "kind": "patch",
          "published_at": "2026-06-13T04:28:30Z"
        },
        {
          "tag": "v0.3.82",
          "kind": "patch",
          "published_at": "2026-06-11T08:59:42Z"
        },
        {
          "tag": "v0.3.74",
          "kind": "patch",
          "published_at": "2026-06-08T06:47:56Z"
        },
        {
          "tag": "v0.3.73",
          "kind": "patch",
          "published_at": "2026-06-07T10:19:47Z"
        },
        {
          "tag": "v0.3.72",
          "kind": "patch",
          "published_at": "2026-06-06T03:07:54Z"
        },
        {
          "tag": "v0.3.71",
          "kind": "patch",
          "published_at": "2026-06-05T19:17:09Z"
        },
        {
          "tag": "v0.3.68",
          "kind": "patch",
          "published_at": "2026-06-04T22:45:44Z"
        },
        {
          "tag": "v0.3.66",
          "kind": "patch",
          "published_at": "2026-06-04T04:46:03Z"
        },
        {
          "tag": "v0.3.52",
          "kind": "patch",
          "published_at": "2026-06-03T11:09:19Z"
        },
        {
          "tag": "v0.3.45",
          "kind": "patch",
          "published_at": "2026-06-03T03:04:02Z"
        },
        {
          "tag": "v0.3.44",
          "kind": "patch",
          "published_at": "2026-06-02T18:21:46Z"
        },
        {
          "tag": "v0.3.43",
          "kind": "patch",
          "published_at": "2026-06-02T08:05:41Z"
        },
        {
          "tag": "v0.3.42",
          "kind": "patch",
          "published_at": "2026-06-01T18:18:52Z"
        },
        {
          "tag": "v0.3.41",
          "kind": "patch",
          "published_at": "2026-06-01T02:44:38Z"
        },
        {
          "tag": "v0.3.40",
          "kind": "patch",
          "published_at": "2026-05-30T07:55:01Z"
        },
        {
          "tag": "v0.3.39",
          "kind": "patch",
          "published_at": "2026-05-30T03:22:33Z"
        },
        {
          "tag": "v0.3.38",
          "kind": "patch",
          "published_at": "2026-05-29T21:12:33Z"
        },
        {
          "tag": "v0.3.37",
          "kind": "patch",
          "published_at": "2026-05-29T10:14:28Z"
        },
        {
          "tag": "v0.3.36",
          "kind": "patch",
          "published_at": "2026-05-29T09:38:29Z"
        },
        {
          "tag": "v0.3.35",
          "kind": "patch",
          "published_at": "2026-05-29T08:17:33Z"
        },
        {
          "tag": "v0.3.34",
          "kind": "patch",
          "published_at": "2026-05-27T12:08:32Z"
        },
        {
          "tag": "v0.3.33",
          "kind": "patch",
          "published_at": "2026-05-27T11:00:07Z"
        },
        {
          "tag": "v0.3.32",
          "kind": "patch",
          "published_at": "2026-05-27T10:35:36Z"
        },
        {
          "tag": "v0.3.31",
          "kind": "patch",
          "published_at": "2026-05-25T19:58:28Z"
        },
        {
          "tag": "v0.3.30",
          "kind": "patch",
          "published_at": "2026-05-24T12:40:57Z"
        },
        {
          "tag": "v0.3.29",
          "kind": "patch",
          "published_at": "2026-05-24T11:47:44Z"
        },
        {
          "tag": "v0.3.28",
          "kind": "patch",
          "published_at": "2026-05-24T06:59:06Z"
        },
        {
          "tag": "v0.3.27",
          "kind": "patch",
          "published_at": "2026-05-23T07:28:23Z"
        },
        {
          "tag": "v0.3.26",
          "kind": "patch",
          "published_at": "2026-05-21T23:54:26Z"
        },
        {
          "tag": "v0.3.25",
          "kind": "patch",
          "published_at": "2026-05-18T08:35:14Z"
        },
        {
          "tag": "v0.3.24",
          "kind": "patch",
          "published_at": "2026-05-15T21:32:03Z"
        },
        {
          "tag": "v0.3.23",
          "kind": "patch",
          "published_at": "2026-05-15T04:23:12Z"
        },
        {
          "tag": "v0.3.22",
          "kind": "patch",
          "published_at": "2026-05-14T14:04:41Z"
        },
        {
          "tag": "v0.3.21",
          "kind": "patch",
          "published_at": "2026-05-13T06:03:45Z"
        },
        {
          "tag": "v0.3.20",
          "kind": "patch",
          "published_at": "2026-05-12T21:06:24Z"
        },
        {
          "tag": "v0.3.19",
          "kind": "patch",
          "published_at": "2026-05-11T06:40:40Z"
        },
        {
          "tag": "v0.3.18",
          "kind": "patch",
          "published_at": "2026-05-11T01:13:33Z"
        },
        {
          "tag": "v0.3.17",
          "kind": "patch",
          "published_at": "2026-05-04T21:13:18Z"
        },
        {
          "tag": "v0.3.16",
          "kind": "patch",
          "published_at": "2026-03-31T22:08:59Z"
        },
        {
          "tag": "v0.3.15",
          "kind": "patch",
          "published_at": "2026-03-31T21:39:56Z"
        },
        {
          "tag": "v0.3.14",
          "kind": "patch",
          "published_at": "2026-03-31T18:58:28Z"
        },
        {
          "tag": "v0.3.11",
          "kind": "patch",
          "published_at": "2026-02-14T10:55:00Z"
        },
        {
          "tag": "v0.3.10",
          "kind": "patch",
          "published_at": "2026-02-14T08:38:54Z"
        },
        {
          "tag": "v0.3.9",
          "kind": "patch",
          "published_at": "2026-02-14T07:46:57Z"
        },
        {
          "tag": "v0.3.8",
          "kind": "patch",
          "published_at": "2026-02-13T23:33:43Z"
        },
        {
          "tag": "v0.3.7",
          "kind": "patch",
          "published_at": "2026-02-13T19:39:02Z"
        },
        {
          "tag": "v0.3.6",
          "kind": "patch",
          "published_at": "2026-02-13T13:24:41Z"
        },
        {
          "tag": "v0.3.5",
          "kind": "patch",
          "published_at": "2026-02-13T12:26:27Z"
        },
        {
          "tag": "v0.3.4",
          "kind": "patch",
          "published_at": "2026-02-13T11:03:33Z"
        },
        {
          "tag": "v0.3.3",
          "kind": "patch",
          "published_at": "2026-02-13T10:39:56Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-02-10T00:31:40Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-02-10T00:07:09Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2026-02-10T00:00:50Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "3c05339898293bc3d589f738eec8b509a7495f94",
          "body": "…e-off scripts (#97)\n\n* fix(workers): steer implement/test workers to dedicated tools over one-off scripts\n\nThe worker bash surface (implement/test only) now frames bash as the tool for builds/tests/git/package-managers/running programs and points reading, searching, and editing at the dedicated too\n[…]\n../; bridge-paths.ts doc reference updated. Unrelated to the worker-prompt change but folded in per the zero-tolerance-CI policy (a red matrix job blocks merge regardless of who introduced the flake).",
          "is_bot": false,
          "headline": "fix(workers): steer implement/test workers to dedicated tools over on…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-07-17T05:24:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c525c5e8f71df30b0e9915395644cd192577e7c9",
          "body": "…n-answer, empty-draft fix, complete=merged, greatness + eval v0.4) (#95)\n\n* feat(first-mate): answer plan-mode cloud-agent questions + autonomous CEO operating protocol\n\nProblem 1 — cloud agents no longer silently stall on waiting_for_user:\n- answer_agent_question delivers via @copilot mention (PR)\n[…]\nlts contract.\n\nSpread the real module and PATHS, overriding only FIRST_MATE_DIR, so the\nmock is minimal and leaves sibling exports intact.\n\n---------\n\nCo-authored-by: animeshkundu <anik.edu@gmail.com>",
          "is_bot": false,
          "headline": "feat(first-mate): robust + honest autonomous cloud-agent driving (pla…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-07-15T11:29:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d40a62e7f3d639edb9e6337405c5898b6242a581",
          "body": "…s via file (#96)\n\n* fix(workers): mandatory worktree for implement/test + relay-safe diffs via file\n\nworker_implement/worker_test now ALWAYS run in an isolated git worktree,\nenforced at the MCP boundary (runWorkerToolCall) rather than the engine so\nthe orchestration kernel's direct runWorkerAgent c\n[…]\name url, Bearer nonce, workspace headersHelper) so they can't drift.\n\nNative implementer/debugger/qa-engineer subagents are unchanged (they run on\nnative tools); giving them MCP access is a follow-up.",
          "is_bot": false,
          "headline": "fix(workers): mandatory worktree for implement/test + relay-safe diff…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-07-15T10:21:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "55482612eb16f64e800d5eb31fa1af1ea57cc78b",
          "body": "…olations\n\nThe concurrent-drainer orphan claim treated only ENOENT as \"a peer already\nclaimed it\" and threw on every other rename error. On POSIX a losing concurrent\nrename gets a clean ENOENT, but on Windows two processes renaming the SAME source\ntransiently surface EPERM/EACCES/EBUSY (a sharing vi\n[…]\n current-inbox claim. Added a deterministic regression test that mocks\nfs.rename to throw EPERM once and asserts the orphan is still claimed. Stressed\nthe concurrent-drainers test 20/20 green locally.",
          "is_bot": false,
          "headline": "fix(first-mate): retry AnswerInbox claim-rename on Windows sharing vi…",
          "author_name": "animeshkundu",
          "author_login": "animeshk",
          "committed_at": "2026-07-12T11:10:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "43479b2b4315e5574504f0cb3906c1a85cccec8f",
          "body": "…h the user\n\nserve blanket-enabled bypassPermissions (settings.json defaultMode +\nlocalStorage skipPermissions:true), which makes CloudCLI's Agent-SDK skip the\ncanUseTool callback entirely. That callback is the only channel CloudCLI's\ninteractive widgets ride on, so AskUserQuestion and ExitPlanMode \n[…]\nCross-lab review (codex + gemini) folded in: defensive interaction-tool filter,\nand preserve the user's explicit non-bypass posture. verify-serve-session +\nunit tests updated for the non-bypass model.",
          "is_bot": false,
          "headline": "fix(serve): non-bypass permissions — routine seamless, decisions reac…",
          "author_name": "animeshkundu",
          "author_login": "animeshk",
          "committed_at": "2026-07-12T10:59:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "622d558a52fda94038cafc357ecbd062e4b2d059",
          "body": "* feat(serve): browser control plane via CloudCLI reverse proxy\n\nAdd `github-router serve`: one command that stands up a browser control\nplane by launching CloudCLI (AGPL, separate process) and reverse-proxying\nit under github-router's own origin with zero-login JWT injection. Claude\nsessions route \n[…]\noncile / serveTunnelId + the exceptId sweep are\nunit-tested. NOTE: the URL subdomain is a devtunnels token, not the id — stable/\nbookmarkable but not human-readable (devtunnel controls the subdomain).",
          "is_bot": false,
          "headline": "feat(serve): browser control plane via CloudCLI reverse proxy (#90)",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-07-12T09:14:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "be7d6795139b561cab1cc0f45f681caaf8b8a6e8",
          "body": "…ore_info (#94)\n\n* feat(stand_in): holistic alternative, required context, both-round need_more_info\n\nstand_in (away-mode 3-lab advisor):\n- Add a hard-gated `alternative` channel: a model may propose a concrete\n  unlisted option when every provided option is inadequate. It is\n  null-equivalent (neve\n[…]\nt\n  copy (never mutating the persisted job, so a post-crash retry does not crash\n  again). The recovery test forces a single-worker pool and asserts crash +\n  respawn via `__workerLifecycleForTest()`.",
          "is_bot": false,
          "headline": "stand_in: holistic alternative + required context + both-round need_m…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-07-11T21:19:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "82f77939ebf9de49380924773b7730767f0e23c3",
          "body": "…) (#93)\n\nAdd two native subagents alongside the existing implementer, all running\non gpt-5.6-sol (fallback gpt-5.5) via the /v1/messages translation shim\nwith Claude's native tools:\n\n- debugger: reproduce a bug end to end, isolate the true root cause,\n  propose a minimal fix.\n- qa-engineer: review \n[…]\nest asserting every emitted subagent name is swept.\n- Awareness snippet always names the three subagents; the\n  worker-implement contrast stays gated on worker tools.\n- Docs + package.json patch bump.",
          "is_bot": false,
          "headline": "feat: add native debugger + qa-engineer subagents (gpt-5.6-sol, xhigh…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-07-10T11:15:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "df4aaf6ed22f1899de94d9ef85e1063f3264b9e6",
          "body": "…(#92)\n\n* feat: default OpenAI-role surfaces to gpt-5.6-sol (gpt-5.5 fallback)\n\nSwitch the default OpenAI model from gpt-5.5 to gpt-5.6-sol across all\nfunctional surfaces, keeping gpt-5.5 as a fallback. gpt-5.6-sol is a\nsame-tier, newer, 1M-context model whose reasoning allowlist is a\nsuperset of gp\n[…]\nlled in transitively via handler.ts) now imports resolveOpenAiFrontier, so the\npartial mock must re-export it or the per-process isolated run fails with\n'Export named resolveOpenAiFrontier not found'.",
          "is_bot": false,
          "headline": "feat: default OpenAI-role surfaces to gpt-5.6-sol (gpt-5.5 fallback) …",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-07-10T08:23:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c1a103c8cc3ba4f482d59d6979cde2c6739b910f",
          "body": null,
          "is_bot": false,
          "headline": "Delete {t",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-07-09T08:06:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ccd761fb4a271c91a3b3843f23f8c2dd902e01b1",
          "body": "…criptions, hook-firing fixes, plan-review gate (#91)\n\n* feat(mcp): W4 conditional-flag injection correctness + Wave 1 tool-surface fixes\n\nW4 gating (advertised-iff-available): retag browser act+find to browser_compound so each tier is self-sufficient; split buildPeerAwarenessSnippet into lead/compo\n[…]\ns),\natomic write, one-way mirror (never flows back to the user's real settings),\nbest-effort, opt out with GH_ROUTER_DISABLE_NO_ATTRIBUTION=1. New helper +\n7 unit tests; doc in docs/auth-isolation.md.",
          "is_bot": false,
          "headline": "MCP injected-surface audit: gating correctness, Anthropic-aligned des…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-07-09T07:27:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "eeff8d75fc87f7e32e1c807d2b22869a888713c2",
          "body": "* first-mate: add server-side scheduler (Phase 1)\n\nReliability layer for the deterministic supervisor, per the cross-lab design\nreview. Removes the client-side polling heartbeat as the wake source without\nchanging autonomy (all judgments still escalate to the lead).\n\n- lease.ts: single-driver lease \n[…]\nrst-mate: fix Phase 2 cross-lab findings — zero-unit false-complete, cyclic dependsOn, dropped dep edges\n\n* chore: bump version for first-mate Phase 2 (tier1 offload + DONE auto-complete + mark_ready)",
          "is_bot": false,
          "headline": "first-mate: server-side scheduler (Phase 1, draft) (#83)",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-07-07T08:28:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "87d5acc47e79833b9c49e4cbfd4e3c0d7869ee93",
          "body": "…e tools (#88)\n\nNon-Claude models routed through the /v1/messages translation shim (the gpt-5.5\nimplementer subagent, `-m gpt-5.5`, gemini) receive Claude Code's Edit/Write tool\ndefinitions verbatim, but their base prior is to script file operations in\nPython/Bash instead of calling the dedicated to\n[…]\nBLE_SHIM_TOOL_STEERING (parsed via the shared parseBoolEnv so\n=0/=false do not misfire). Also reinforce the implementer subagent prompt to\nprefer Edit/Write/Read and reserve Bash for builds/tests/git.",
          "is_bot": false,
          "headline": "feat(anthropic-translate): steer non-Claude shim models to native fil…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-07-06T12:57:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9db9019b3332f6fb08eea8745b820ce72ed1e03a",
          "body": "…rker/model updates (#87)\n\n* feat: native non-Claude models in Claude Code via a translation shim\n\nAdd an Anthropic-Messages <-> OpenAI-Responses / Gemini-chat translation\nshim (src/lib/anthropic-translate/) so Claude Code's main agent loop can run\non non-Claude Copilot models, selectable natively i\n[…]\n catalog +\n  the xhigh-clamp test updated (now pins gemini-3.1-pro-preview so the\n  clamp-to-high assertion is exercised against a max-high model).\n\nCombined CI green (2366 pass); isolated loop green.",
          "is_bot": false,
          "headline": "feat: native non-Claude models in Claude Code (translation shim) + wo…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-07-06T01:53:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "36eba2567c451f415aa0ce9eb01395f84e49cf1b",
          "body": "…e guard (#86)\n\n* feat(workers): non-blocking worker-* subagents + main-agent PreToolUse guard\n\nThe workers MCP tools (explore/implement/review/plan/test) block the caller for\nup to 30 min. An MCP server cannot push a completion into Claude's conversation,\nso the notify-on-done behavior only exists \n[…]\nex-mcp still skips MCP wiring yet injects operating-defaults without the\npeer snippet; typecheck + lint + CI-equivalent green. Worker-* guard + dispatch\nsmoke re-confirmed live in the rebuilt session.",
          "is_bot": false,
          "headline": "feat(workers): non-blocking worker-* subagents + main-agent PreToolUs…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-07-05T06:14:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7856c5299801d94f334ca19923bf75162d0029cd",
          "body": "…, artifact_update/refresh/await/dismiss + typed drain, interactive data-aod-* renderer (choose-one + multi-select), skill + directive (#85)\n\nCo-authored-by: anikundu <anikundu@microsoft.com_msteamsmdb>",
          "is_bot": false,
          "headline": "feat(artifact): producer tools v2 P0+P1 — client retry+idempotencyKey…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-07-04T02:05:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fdc67a4323857e0a8f7513ceeb7e5873323017fc",
          "body": "…guard, stop-hook opt-out (#84)\n\n* feat(fleet): drive_task primitive + reliable turn-signal await + send-when-idle guard + named submit/interrupt + stop-hook opt-out\n\nWS2 fleet-driving hardening: await_turn keys on turn_ended/waiting_input (not idle flicker) with cursor guard; send_message readiness\n[…]\n read state together with\n  settled/interrupted/recovered, and notes submitted is a best-effort signal.\n\nTests: 142 pass across the fleet + stop-gate suites (regression tests for each\nfix); tsc clean.",
          "is_bot": false,
          "headline": "feat(fleet): drive_task + reliable turn-signal await, send-when-idle …",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-07-04T00:06:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c8b9443b532ebff10a130c5c090c66d4eb055585",
          "body": "…(#81)\n\n* feat(first-mate): Phase 1 — dual-token auth + --agents flag\n\nAdd a second, write-capable GitHub token for the first-mate cloud-agent\norchestration surface, distinct from the Copilot App token (read:user,\nverified to 403 on write). Minted via a separate device-flow login\nagainst the GitHub \n[…]\ning): tests/internal-hooks-crash.test.ts subprocess\nteardown tests intermittently time out at the 5s limit under machine load — a\ntiming flake in the hooks/libuv subsystem, not touched by this change.",
          "is_bot": false,
          "headline": "feat: first-mate — orchestrate GitHub cloud coding agents (--agents) …",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-07-02T07:43:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3d99d9d54d9d565b396c90ba198338633073a00f",
          "body": "…roxy (#82)\n\nThe github-router host is not on the tailnet, so a plain fetch to a .ts.net peer\nfails. Consume the ai-or-die --mesh sidecar's loopback HTTP CONNECT proxy.\n\n- discovery: readMeshEgress reads a 0600 mesh/egress.json, accepting ONLY a\n  numeric-loopback http url (127.0.0.1/::1, no localho\n[…]\nInfo,\n  list_instances, errors, notices, or logs. Regression + integration tested\n  (undici -> local CONNECT proxy asserts the Proxy-Authorization tunnels).\n\nCo-authored-by: Kundus <kundus@mini.local>",
          "is_bot": false,
          "headline": "feat(fleet): route mesh peers through the sidecar's loopback egress p…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-07-01T11:06:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "25fcf9efa19f6aedc87de266415aab9c779f886e",
          "body": "…efault artifact directive (#79)\n\nA1 (fixes intermittent \"advisor loop failed: fetch failed\"): add\nretryTransient:true to the 6 upstream inferencing call sites that lacked it:\nthe advisor continuation (advisor.ts), the two worker stream loops\n(stream-fn.ts), the worker advisor tool (tools.ts), and t\n[…]\ne lever split in a comment: PostToolUse(ExitPlanMode) stays the\none deterministic auto-open hook, and the directive covers the model-judgment\ncases no hook can detect.\n\npackage.json bumped to 0.3.136.",
          "is_bot": false,
          "headline": "fix(inferencing): transient-retry on all inferencing callers + HTML-d…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-07-01T02:45:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8c9918f96c4765dfe1076f6d63fd309d48ec9f75",
          "body": "…h (#80)\n\nMake the mesh the primary, zero-config fleet source instead of a hand-\nmaintained fleet.json. github-router reads the local instance's\nmesh/peers.json off disk and synthesizes token-less mesh instances driven\nover the tailnet (each peer's own sidecar injects the bearer; the\ntag:aiordie ACL\n[…]\nen by ai-or-die's\nMeshManager. Failure modes covered: hostile/foreign dnsName, id collision\nwith static, malformed/oversized file, discovery outage (static intact),\nconcurrent fan-out (single-flight).",
          "is_bot": false,
          "headline": "feat(fleet): auto-discover instances over the ai-or-die Tailscale mes…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-07-01T00:14:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7c24d8ef8c89c44f67d95ac7d4036c4b09818f2e",
          "body": "… plan review (#78)\n\n* fix(artifact): insecure-TLS for self-signed ai-or-die + default plan review\n\nArtifact panel never opened: ArtifactClient hit ai-or-die's self-signed\nhttps://127.0.0.1 with plain fetch and no TLS bypass, failing with\nDEPTH_ZERO_SELF_SIGNED_CERT (UNREACHABLE). The 404s were down\n[…]\no prefer authoring a self-contained .html artifact (the\npanel renders + annotates HTML natively; plans are auto-rendered; raw markdown is\nthe fallback). Add a test asserting the directive steers HTML.",
          "is_bot": false,
          "headline": "fix(artifact): insecure-TLS for self-signed ai-or-die panel + default…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-06-30T00:57:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4675e8a552867b0e2888407b29f3ad49139aa5e1",
          "body": "…-stop default) (#77)\n\n* feat(workers): explore→gpt-5.4-mini, review→gpt-5.5 (drop flash early-stop)\n\nSplit the shared read-only worker default: explore uses gpt-5.4-mini@xhigh\n(fast, tool-loop-disciplined, no empty-turn early-stop), review gets its own\ngpt-5.5@xhigh for max reasoning headroom. gemi\n[…]\nL (gpt-5.4-mini); review's gpt-5.5 errors at\ncall time if absent, like implement. Tests + docs updated, version 0.3.130.\n\n* test(workers): drop browse≠worker-default assertions (both now gpt-5.4-mini)",
          "is_bot": false,
          "headline": "feat(workers): explore→gpt-5.4-mini, review→gpt-5.5 (drop flash early…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-06-29T11:16:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "083fd441aa4bbdc2438e02fa3ae1662f97755408",
          "body": "Add ArtifactClient.end() (POST /:sessionId/end) and an artifact_end tool to\nARTIFACT_TOOLS so an agent can cleanly close the artifact-review loop. Parity\ntests added (5/5).",
          "is_bot": false,
          "headline": "feat: add artifact_end MCP tool (#76)",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-06-29T00:17:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f9d32e7a2bc29ac172fae78bc109bfe3e6909f69",
          "body": "…stances (#75)\n\n* feat(fleet): per-instance insecureTLS for direct-HTTPS self-signed instances\n\nAdds an `insecureTLS` flag to fleet registry instances. When set, the\nFleetClient sends `tls: { rejectUnauthorized: false }` for that instance's\nrequests, so the fleet can reach a direct-HTTPS ai-or-die (\n[…]\nIPv6, or an mDNS `.local` name. http, a Dev Tunnel\n(host or tunnelId/tunnelToken), and any other public/routable host are rejected\nat load. 100.64.0.0/10 (CGNAT) is intentionally not treated as local.",
          "is_bot": false,
          "headline": "feat(fleet): per-instance insecureTLS for direct-HTTPS self-signed in…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-06-28T20:20:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c1219f97b00deeff8d5d11df9314216dda7e47cf",
          "body": "* feat(fleet): private Dev Tunnel auto-refresh (X-Tunnel-Authorization)\n\nLets a local fleet client reach a remote ai-or-die instance behind a PRIVATE\nVS Code Dev Tunnel. New src/lib/fleet/tunnel-auth.ts mints connect-scope tokens\nvia the devtunnel CLI (lazy per-tunnel cache + single-flight + backoff\n[…]\nerrors, never isError), and 100-way concurrent create_session with correct\nper-instance ids. Evidence that the control plane holds for 100+ instances, not just an\nassertion. 4 tests / 1119 assertions.",
          "is_bot": false,
          "headline": "Fleet control-plane hardening + private Dev Tunnel auth (#74)",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-06-28T09:21:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2300768c85f293f9ea35ecbd696a3a91dd87817b",
          "body": "* feat: fleet + artifact MCP groups for ai-or-die control\n\nAdd two opt-in MCP groups that let a client claude drive ai-or-die instances\nover their authed tunnels:\n\n- fleet: registry (https-only, 0600, id/label resolution, reachability probe)\n  + typed FleetClient + tools (list_instances, list/read/c\n[…]\nclean; 28 fleet/artifact tests\nplus updated group-machinery tests.\n\n* test: MCP_GROUPS now has seven intent groups (fleet added)\n\n* test: stub fleet/artifact capability gates in cli-claude module mock",
          "is_bot": false,
          "headline": "feat: fleet + artifact MCP groups for ai-or-die control (#73)",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-06-27T00:43:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "71408da7e21d04e0be19f39bd826563cf36143ba",
          "body": "* Make the structural Stop-gate language-agnostic\n\nThe Stop-gate only auto-enabled for Bun/TS repos: detectHarnessGateId\nrequired a `typecheck` npm script and the sealed gates hard-coded\n`bun run ...`. A repo without a typecheck script (plain JS, Python,\nRust, Go) silently got no gate AND no message\n[…]\nde:child_process and the launch\nhung (15s timeout x 31 tests). Stub repoRoot/repoFingerprint in the same\nmock so the wiring stays git-free and spawn-call assertions read the\nclaude launch as calls[0].",
          "is_bot": false,
          "headline": "Make the structural Stop-gate language-agnostic (#72)",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-06-21T02:31:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "11bff0e1221dd438be1f3fe6a11f0af72857b709",
          "body": "cleanup() called plain child.kill(), which on Windows reaped only the\ncmd.exe wrapper and orphaned the node/MCP grandchildren. Replace it with\na canonical killChildProcessTree (taskkill /T /F on Windows, kill(-pgid)\nSIGTERM->SIGKILL on POSIX) so the whole CLI subtree dies on every\ngraceful exit path\n[…]\ncp/session-registry.ts: idempotent exit-handler registration.\n- tests: unit + real crash E2E (Windows job-object canary, POSIX reaper)\n  + functional kill; docs/process-teardown.md; CLAUDE.md pointer.",
          "is_bot": false,
          "headline": "Deterministic child-process teardown (no orphans on exit) (#71)",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-06-20T06:53:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e735580333950dd5287872a42d314b4330e0161b",
          "body": "…ok (#70)\n\nWhen launched inside an ai-or-die Terminal tab (env AIORDIE_CLAUDE_BIND set\nto a per-tab sidecar path), register a Claude Code SessionStart/SessionEnd\nhook that atomically writes the active session id + transcript path to that\nsidecar on every startup/resume/clear/compact. ai-or-die watch\n[…]\nuses a path\n  containing a quote); strip AIORDIE_CLAUDE_BIND from claude's env so a nested\n  launch can't hijack the parent tab.\n\nContract: docs/aiordie-session-bind.md. Consumer side is in ai-or-die.",
          "is_bot": false,
          "headline": "feat: emit per-tab claude session id to ai-or-die via SessionStart ho…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-06-18T21:43:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4b951e958849b50c0ebfd741d05c6317eb62d764",
          "body": "… + default-on structural Stop-gate (#69)\n\n* feat(stop-gate): consent-gated, top-level-only structural gate with baseline isolation\n\nHarden the Phase-0 Stop-gate into a safe default-capable form (safety core of\nthe floor-raising agent surface, docs/floor-raising-agent-surface.md):\n\n- Per-repo trust \n[…]\nate stays off -> block inert, no git spawns).\n\nAll 36 cli-claude tests pass; all 16 isolated suites green; typecheck + lint\nclean. Pre-existing (fails at the pre-hook-v2 tip); fixed so #69 goes green.",
          "is_bot": false,
          "headline": "Floor-raising agent surface: research/orchestrate/floor-keeper skills…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-06-18T05:43:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1a0441fbc6c55aad915521fc2d414276084dfe59",
          "body": "… (#68)\n\nLong unattended agent sessions (claude/codex/fleets) can die when Windows\nidle-sleeps. Spawn a persistent powershell.exe helper that holds a\nSetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED) assertion for\nthe proxy's lifetime, mirroring GitHub Copilot CLI's /keep-alive.\n\n- src/lib\n[…]\nGH_ROUTER_KEEP_DISPLAY_ON=1\n  adds ES_DISPLAY_REQUIRED.\n- Tests (tests/keep-awake.test.ts incl. real-spawn + crash-safety), docs\n  (docs/windows-keep-awake.md, CLAUDE.md section), version bump 0.3.88.",
          "is_bot": false,
          "headline": "feat(windows): keep the machine awake by default while the proxy runs…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-06-16T12:29:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8bb141e67975ec225dcdec9cd6abdb281da1bb0b",
          "body": "…gine (PR 1 of N) (#67)\n\n* Add worker_plan and worker_test modes (agent orchestration, Phase 0)\n\nFirst implementation slice of the agent-orchestration design\n(docs/agent-orchestration-design.md): two new role-framed worker modes.\n\n- worker_plan: read-only planning worker (mirrors review mode's surfa\n[…]\nanch stays checked out, and branch -D fails, so the branch would\n  still be listed). Dropped the Windows-fragile existsSync check.\n\nVerified: all 16 isolated test files pass + main suite green (1545).",
          "is_bot": false,
          "headline": "Agent orchestration: verified logic core + floor primitives + gate en…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-06-16T12:17:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2c836ed7455e49f68304691bf9f8822b4ffefd53",
          "body": "* Unify code search (semantic-first) + full-power worker subagents\n\nFold the standalone `semantic_search` MCP tool into `mcp__search__code`.\nIts default `mode:\"semantic\"` ranks by MEANING via ColBERT and transparently\nfalls back to lexical BM25F when the per-workspace index is building/stale/\nabsent\n[…]\n get a lexical\n  fallback + retry).\n\nEmpirically verified concurrent colgrep reads are clean; the corruption was\nkill-induced, not concurrency-induced. Shared index-progress probe for init\nand search.",
          "is_bot": false,
          "headline": "Unify code search (semantic-first) + full-power worker subagents (#66)",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-06-13T04:24:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ea03ee697b62749bfcc3c9274df8f45da79553e9",
          "body": "… endpoint-aware compressor (#65)\n\n* Demote gemini-3.5-flash from browser-MCP compressor default\n\nThe browser-MCP inner compressor (browser_find / browser_act intent mode /\nbrowser_extract / browser_observe / visual fallback / planner) led its\nbackend fallback chain with gemini-3.5-flash, which earl\n[…]\nor / cap / visibility gates\nplus an eval() of the real generated expression (caught a toString-capture\nbug pre-merge), and a mocked-CDP test for the per-frame merge and the\nnon-fatal child-frame path.",
          "is_bot": false,
          "headline": "Pi-driven multi-session browser agent (gpt-5.4-mini via /responses) +…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-06-11T08:55:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a2e7c1fc6e9532660fffe5101b1ddfa80a47e9e6",
          "body": "…s npx/bunx upgrades (#64)\n\nThe --browse extension and bridge loaded straight out of the npm package\nroot, which under npx/bunx is an ephemeral cache path that changes per\nversion. A persisted Chrome \"Load unpacked\" only stays valid while its\ndirectory path is constant, so an upgrade broke it; the N\n[…]\n\n- Opt out with GH_ROUTER_DISABLE_BROWSER_PROVISION=1.\n\nTests: new provision + resolver isolated suites; E2E harness pinned to\nthe bundled dir; existing browser-mcp mocks updated. Docs + version bump.",
          "is_bot": false,
          "headline": "Materialize browser extension into a stable app-dir so reload survive…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-06-08T06:43:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "44fee53ceb6b0d1524379f239a6b6580f1d66168",
          "body": "…retry resilience (#63)\n\n* code_search: complete-mode recall floor, default structural summary, retry resilience\n\nMake `code_search` the one-stop search tool and remove the silent recall\nmisses it had.\n\ncode_search:\n- Add `complete: true` — disables the ranked shoulder cut + per-file cap\n  and retur\n[…]\nappears only when colgrep is actually provisioned and the\ntool would work. Maximal byte cap raised to 3300 and the test MAXIMAL now\nincludes powerBrowseAvailable so the cap guards the true worst case.",
          "is_bot": false,
          "headline": "code_search: complete-mode recall floor, default structural summary, …",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-06-07T10:15:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "571338037a31777ffe921bf35841ac7f60f912bb",
          "body": "* Split gh-router-peers MCP into five intent-named servers; rename tools\n\n* Add gemini-reviewer persona (peers) + read-only review worker (workers)\n\n* FileLogReporter: hold a persistent append fd instead of open/close per line\n\n* Worker/gemini-reviewer default → gemini-3.1-pro-preview; strip callee-\n[…]\nready clean.\n\nTests updated for the +gemini_reviewer persona count and the base-catalog\ngemini-3.1-pro-preview shadowing (filter-then-add so the worker-capable model\nwins find()). Version bump 0.3.71.",
          "is_bot": false,
          "headline": "MCP server split + reviewers + log-reporter perf fix (#62)",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-06-06T03:04:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c7198721b903c16e5fd5a9532107e6acc52e704f",
          "body": "* Windows-safe updates, proxy self-update, and LLM toolbelt on PATH\n\nFixes Claude Code never auto-updating on Windows and adds two adjacent\ncapabilities, sharing one Windows-safe exec helper.\n\nRoot cause (Windows): claude-version-check.ts ran `claude`/`npm` via\nexecFile without shell, but those are \n[…]\nfd, sd, jq, yq, ast-grep/sg) instead of just sd, yq.\n\nTests: availableToolCommands advertises all manifest tools on a supported\nplatform, honors GH_ROUTER_TOOLBELT_SKIP and GH_ROUTER_DISABLE_TOOLBELT.",
          "is_bot": false,
          "headline": "Windows-safe updates, proxy self-update, and LLM toolbelt on PATH (#58)",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-06-05T19:12:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "064e5c0ca68f7656c37c646b7398e1abc4f37e0d",
          "body": "…[1m] detection (#57)\n\n* Default Opus → 4.8 (1M); pin opus_critic to 4.6-1m@high; dual-signal [1m] detection\n\nGitHub Copilot enabled `claude-opus-4.8` in the live enterprise catalog. Three\nOpus consumers shift to span more of the version curve:\n\n  * **Spawned-Claude-Code default**: `claude-opus-4-8`\n[…]\n (it's now emitted every session).\n\nStatic-check probes pass (5/5); the two opus_critic live probes and the new\nsonnet probe pass against the live proxy. 1102/1144 tests green, typecheck +\nlint clean.",
          "is_bot": false,
          "headline": "Default Opus → 4.8 (1M); pin opus_critic to 4.6-1m@high; dual-signal …",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-06-04T22:41:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "56eda22bf555dd72cdaa3eafdd15664aba5043ff",
          "body": "… (#56)\n\n* Phase 1a: extract PageSnapshot types to snapshot-types.ts\n\nFoundational step for the deterministic-first browser MCP refactor\n(see plans/for-browse-mcp-and-idempotent-thimble.md). Pulls the\nPageSnapshot / SnapshotElement / VisualSurface types out of\ncompressor.ts into a sibling module so \n[…]\nzen-lockfile` step failed on both ubuntu and\nwindows. Regenerated lockfile resolves cleanly and is byte-stable.\n\nAlso tidies the callCompressor doc-comment to mention the new\ndecompose-planner caller.",
          "is_bot": false,
          "headline": "Browser MCP: deterministic-first refactor (8 commits across 5 phases)…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-06-04T04:41:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a7a341d9e4dbd95534795c1c836b7025921b89cf",
          "body": "…oad (#55)\n\n* Browser MCP: unblock edge://extensions and add version-aware auto-reload\n\nTwo related fixes for the --browse surface, plus a cherry-pick of PR #53.\n\n1. edge://extensions blanked to about:blank whenever the extension was\nenabled. The in-extension webNavigation.onBeforeNavigate listener \n[…]\nnas.test.ts gets browseAvailable: false\nadded to MINIMAL and true to MAXIMAL fixtures + a new test asserting\nthe mention appears iff browseAvailable.\n\nBump 0.3.51 → 0.3.52 per the version-per-PR rule.",
          "is_bot": false,
          "headline": "Browser MCP: unblock edge://extensions and add version-aware auto-rel…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-06-03T11:04:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cab988e3b37587d91f379ce9392649ce61e52f1a",
          "body": "…ol surface (#54)\n\n* Add dual-channel peer-MCP awareness for spawned agents + narrow worker tool surface\n\nSpawned `github-router claude` sessions now deliver the peer-MCP\nawareness snippet through two surfaces so both the main agent AND its\ndescendants see it:\n- `--append-system-prompt` (system-turn\n[…]\n or modify\neffort fields (they pass body through verbatim). If a similar bug\narises there with `reasoning_effort` (top-level shape), the same\nclamp pattern applies — wire the helper in as a follow-up.",
          "is_bot": false,
          "headline": "Dual-channel peer-MCP awareness for spawned agents + narrow worker to…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-06-03T02:58:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "81250155704c5e0cc047227ddce979490c2df197",
          "body": "The `models` subcommand assumed `model.capabilities.limits` and\n`model.capabilities.supports` were always present, but the Copilot\ncatalog returns embeddings rows where one or both are undefined\n(`text-embedding-3-small-inference` has no `limits`,\n`text-embedding-ada-002` has no `supports`). 0.3.43 \n[…]\nfied end-to-end against the live catalog: full `models` and\n`models embedding` now render every row, with embeddings entries\ncorrectly omitting the `limits:` / `supports:` lines they have no\ndata for.",
          "is_bot": false,
          "headline": "Fix `models` CLI crash on catalog entries missing limits/supports (#52)",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-06-02T18:17:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9496e84c7e29f129b1e545e103ea3dda08b14cb6",
          "body": "* Add humanlike-input browser MCP tools + worker workspace param\n\nAdds 4 new browser MCP tools (mouse, drag, type, locate) that route\nthrough CDP Input.dispatch{Mouse,Key,Drag}Event for real input events\nthe page can't distinguish from a human's. Extends browser_scroll with\nat-pointer wheel mode for\n[…]\nH_ROUTER_RUN_BROWSER_E2E=1. Lint, typecheck\nclean. Live-verified bugs #1 + #2 fixed by relaunching the proxy with\nthe rebuilt dist and exercising punctuation typing through MCP against\na fresh Chrome.",
          "is_bot": false,
          "headline": "Add humanlike-input browser MCP tools + worker workspace param (#51)",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-06-02T08:00:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7f51761b0dbcc6fe78efef9ccf00d6ff021d1f17",
          "body": "…'t trigger Anthropic login wizard (#50)\n\n* Inject onboarding-skip fields into .claude.json so fresh machines don't trigger Anthropic login wizard\n\nOn a brand-new machine, `npx github-router@latest claude` completed the\nGitHub device-code login and then dropped the user into Claude Code's\nfirst-laun\n[…]\nlaude Code / Copilot context-window convention) and falls\nback to decimal cleanly. Defensive on missing `billing.multiplier`\nin the upstream catalog (observed empirically on several Anthropic\nmodels).",
          "is_bot": false,
          "headline": "Inject onboarding-skip fields into .claude.json so fresh machines don…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-06-01T18:14:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f66692eddef1caba452bc14e3e1784ecb811979c",
          "body": "Derive prompt-window budgets from the live Copilot catalog's\nmax_prompt_tokens using the exact o200k tokenizer instead of a\nchars-per-token approximation, and route/guard peer reviews by each\nmodel's real window.\n\nAdvisor (advisor.ts, tokenizer.ts):\n- Replace the chars/3 budget (and its stale \"272K\"\n[…]\npect, fallback, exact-o200k truncation invariants) and 5 new peer\ncases (window-guard reject/pass, no-op without max_prompt_tokens, opus\n1M selection + fallback). Full suite green (1013 pass, 0 fail).",
          "is_bot": false,
          "headline": "Catalog-driven, token-exact window budgeting for advisor + peers (#48)",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-06-01T02:40:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "df357a4c4ad5e567caa30423b2005514f0fdf197",
          "body": "Claude Code's getPlanModeV2AgentCount() (verified verbatim in the\nclaude v2.1.158 binary, minified fn `bGK`) gates Phase-2 \"Plan\" agent\nparallelism on subscription tier: the CLAUDE_CODE_PLAN_V2_AGENT_COUNT\nenv override (1..10) wins, else max+default_claude_max_20x -> 3,\nenterprise/team -> 3, else 1.\n[…]\n the now-overridden agent-count branch.\n- Tests pin both the new env default (+ presence-guard preservation) and\n  the credential rateLimitTier.\n\ntypecheck + lint clean; full suite 1003 pass / 0 fail.",
          "is_bot": false,
          "headline": "Raise spawned-claude plan-mode agent parallelism from 1 to 7 (#47)",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-05-30T07:50:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "62098dfa1520ad37948af43f88734b38396ad70e",
          "body": "…ting (#46)\n\n* Fix resolveModel silent downgrade for opus-4.8\n\nWhen `resolveModel('claude-opus-4-8')` was called with a version that\nhas no matching 1M variant in the catalog, the resolver blindly fell\nback to `oneMs[0]` — the first 1M variant in catalog order — silently\ndowngrading (e.g. 4.8 → 4.6-\n[…]\nitic: 400K, strongest reasoning, cross-lab\n- codex-reviewer: 400K, code-specialist, fastest (~16s)\n- opus-critic: up to 1M, largest context, same-lab\n- gemini-critic: 200K, formal reasoning, third-lab",
          "is_bot": false,
          "headline": "Fix code_search NUL-byte corruption, model fallback, and MCP tool rou…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-05-30T03:18:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "433cb0f41965ba4fd9ea68eb4945698af8332a73",
          "body": "…ce LF (#45) (#45)\n\nFix runRipgrep kill on Windows:\n- tools.ts used child.kill('SIGTERM') which doesn't reliably terminate\n  descendants on Windows. Replace with taskkill /T /F /PID pattern\n  matching bash.ts and code-search.ts. EBUSY race swallowed.\n\nAdd Windows cmd.exe test coverage (worker-agent-\n[…]\nycle.ts: document ConPTY/node-pty signal behavior (SIGTERM may\n  not fire; SIGINT + exit handler + boot sweep provide coverage).\n- New docs/windows-pty-behavior.md: signal delivery matrix by terminal.",
          "is_bot": false,
          "headline": "Windows 11 hardening: fix kill path, add cmd.exe test coverage, enfor…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-05-29T21:08:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0b9af33fdf017ef809a0c7278f477efaf9cf601f",
          "body": "…ngs (#44)\n\n* Fix bridgeCall TDZ crash on pre-aborted signal\n\nBug D1: finish() at line 116 calls clearTimeout(timer), but timer is\nconst-declared later at line 136. When signal.aborted is already true\nat call time, onAbort() calls finish() synchronously before timer\nexists, throwing ReferenceError: \n[…]\nest.ts: uses mock.module to\ninject a 200ms timeout, fakes an upstream that sends one chunk then stalls\nforever, and asserts the proxy emits a structured error event + [DONE] within\nthe bounded window.",
          "is_bot": false,
          "headline": "Reliability hardening round 2: fix 3 CRITICAL and 3 SIGNIFICANT findi…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-05-29T10:10:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9561f253666dff8eeb8dbfa70a561fdf2d3cc271",
          "body": "* Fix /mcp SSE consumer-cancel slot and heartbeat leak\n\nhandleToolsCallSSE cleared its 5s heartbeat interval only from start()'s\nfinally block (deferred until the upstream callPromise settled), and\ncancel() signalled inflightAborts but never released the inflight slot\nsynchronously. Combined with se\n[…]\n 50 MiB of\nContent-Length-less application/json; the proxy must return a structured\nerror and stop reading well under 20 MiB. Also verifies normal-sized\nresponses still parse and return 200 correctly.",
          "is_bot": false,
          "headline": "Reliability hardening: fix 2 HIGH and 5 MEDIUM audit findings (#43)",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-05-29T09:34:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "04e0872f344aaa801831846c57c56b075dd34892",
          "body": "`github-router claude -m 4.7` (or 4.6, 4.8, etc.) now expands to the\nbest Anthropic slug for that Opus family, preferring the 1M-context\nvariant when the Copilot catalog has one. Full slugs and any\nnon-matching string continue to pass through unchanged, so the\nexisting power-user pinning path is pre\n[…]\nopus-4-7[1m]`, `pickClaudeDefault(\"4.8\")` returns\n`claude-opus-4-8`, `pickClaudeDefault(\"4.6\")` returns\n`claude-opus-4-6[1m]`. Full `bun test` suite green (965 pass,\n0 fail), typecheck and lint clean.",
          "is_bot": false,
          "headline": "Add Opus family shorthand to `claude --model` flag (#42)",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-05-29T08:12:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "306e7561b5a3b08051fa72c964675c4fbdc0ee8d",
          "body": "On Windows the bridge wrote bridge.json to %LOCALAPPDATA%\\github-router\nwhile the install-check read it from ~/.local/share/github-router (the\ncanonical PATHS.APP_DIR from src/lib/paths.ts, which has no win32\nbranch). The two paths never met, so every browser_* tool call returned\ninstall_required wi\n[…]\n/browser-mcp/bridge-paths.ts\nand import it from both the bridge entry point and install-check. The\nregression test pins the resolution without mocking os.homedir(), which\nis what hid the original bug.",
          "is_bot": false,
          "headline": "Fix browser-bridge discovery path mismatch on Windows (#41)",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-05-27T12:02:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "db300c81c3a02418e52a26b0a3a0bc0002379b03",
          "body": "The published package only includes paths in package.json \"files\",\nwhich was just [\"dist\"]. The extension lived at src/browser-ext/\nso npx-installed users would have ended up with an install_required\nresponse pointing at a load_unpacked_dir that did not exist on\ntheir disk. Local dev hid this becaus\n[…]\n_BROWSER_EXT_DIR for developers\niterating on the extension who don't want to rebuild between edits.\n\nSmoke test and E2E re-run against the new dist path: 24/24 smoke\nprobes pass, 13/13 E2E tests pass.",
          "is_bot": false,
          "headline": "Ship the extension in the npm tarball (#40)",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-05-27T10:54:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fba27b5b1a5952f1bcc0107b3e91fde229c61c83",
          "body": "* Add browser control MCP tools behind --browse flag\n\nAdds a 15-tool browser_* suite to /mcp that lets a model drive Chrome\nor Edge through a from-scratch MV3 extension and a Node native-messaging\nbridge. Off by default. Enable with `--browse` (or GH_ROUTER_ENABLE_BROWSE=1)\non `github-router start`,\n[…]\n-browser regex, about:blank allowed\nregression check, missing args, non-existent refs / tabIds, JS\nsyntax errors, console capture, network capture). 24/24 pass\nagainst Playwright's Chrome for Testing.",
          "is_bot": false,
          "headline": "Add browser control MCP tools behind --browse flag (#39)",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-05-27T10:32:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f187f4118d09ce34b2d19a123fa84f3aca35f1f4",
          "body": "…ns (#38)\n\nPolls gpt-5.5 xhigh + claude-opus-4-7 xhigh + gemini-3.1-pro-preview high\nacross blind round 1 → informed round 2 → abstain, returns a ranked\nverdict (consensus / majority / no_consensus / need_more_info). Bounded\nto advisor, not decider: irreversible actions still require the user.\n\nCode\n[…]\nap = 6KB on JSON path, fires before slot acquisition.\n\nLocal: typecheck + lint clean, 922 tests pass; smoke-tested end-to-end\nagainst the live proxy (consensus on a real decision in ~2-3 min via SSE).",
          "is_bot": false,
          "headline": "Add stand_in MCP tool — 3-lab consensus advisor for away-mode decisio…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-05-25T19:55:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2559e5e944bb75d783cf5abb8634cab8c229116b",
          "body": "The proxy shares a TTY with the Claude TUI under `github-router claude`, so\nthe per-call `[peer-mcp] name=... model=... duration_ms=... result=...` line\nwritten directly to stderr from `logTelemetry()` shows up as ambient noise in\nClaude's UI on every persona, web_search, code_search, and worker_* c\n[…]\noff; set `GH_ROUTER_LOG_PEER_MCP=1` to re-enable\nthe maintainer \"earn their keep\" trace. Mirrors the strict `=== \"1\"` opt-in\npattern of `GH_ROUTER_LOG_FIELDS`.\n\nNo existing test asserted the log line.",
          "is_bot": false,
          "headline": "Make peer-mcp telemetry log opt-in via GH_ROUTER_LOG_PEER_MCP (#37)",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-05-24T12:37:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "36d14611b5b7891d5bba3a56b734533476601eab",
          "body": "…ime (#36)\n\n* Add worker_explore and worker_implement MCP tools on vendored Pi runtime\n\nTwo new MCP tools on /mcp:\n- worker_explore: read-only investigation tools (read, glob, grep,\n  code_search, web_search, fetch_url, peer_review, advisor)\n- worker_implement: full read+write (adds edit, write, bas\n[…]\ntocrlf=false + core.eol=lf in the per-repo config in\n   both makeRepo helpers (worktree + boot-sweep).\n\nbun test green at 902/0 on macOS. Pushing to confirm windows-latest\n+ ubuntu-latest CI go green.",
          "is_bot": false,
          "headline": "Add worker_explore and worker_implement MCP tools on vendored Pi runt…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-05-24T11:44:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4d916c945d798fb051500554c463e8de2e70c906",
          "body": "* Add code_search MCP tool with BM25F ranking over ripgrep\n\nExposes mcp__gh-router-peers__code_search alongside the peer-critic\npersonas and web_search. Backed by ripgrep with BM25F ranking\n(Robertson, Zaragoza, Taylor 2004 - CIKM) over four code-aware fields:\nmatched line, surrounding context, file\n[…]\nult stays under 300KB. Legacy field-name absence\nverified at the MCP boundary.\n\nDocs: CLAUDE.md, README.md, docs/peer-mcp-design.md all updated\nincluding the minimality-principle worked-example table.",
          "is_bot": false,
          "headline": "Add code_search MCP tool with BM25F ranking over ripgrep (#35)",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-05-24T06:55:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9936fea3358899c45dd15b5dfd5d9c4cfa2000ed",
          "body": "…s (#34)\n\nWires Claude Code's [1m] literal-bracket 1M-context unlock so enterprise\nCopilot tiers get the 1,000,000-token window (compaction triggers,\nstatus-line %, token budgets) instead of silently capping at 200K. Also\nseeds ANTHROPIC_DEFAULT_{SONNET,HAIKU,OPUS}_MODEL so the /model picker\nshows i\n[…]\nnd for\nthose families (catalog evidence in docs/copilot-compat-matrix.md) and\nAnthropic-side modelSupports1M doesn't list haiku at all, so bracketing\nwould either 400 upstream or over-account locally.",
          "is_bot": false,
          "headline": "Unlock 1M context via [1m] suffix and seed /model picker tier default…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-05-23T07:25:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "83220d183700e6a33f0ce14d99fd2205b1ade6e7",
          "body": "…wareness snippet (#33)\n\n* Make subagent MCP visibility holistic + add ~100-token peer/advisor awareness snippet\n\nSubagents (Agent tool, forks, agent-teams subprocesses) discover MCP servers from\npersistent CLAUDE_CONFIG_DIR/.claude.json scope, NOT from the parent's ephemeral\n--mcp-config CLI flag. \n[…]\nESS opt-out predicate (default-on, \"0\", uppercase\n\"FALSE\").\n\nExpose the mocked process.env as a hoisted mutable object so env-conditional\ntests can drive the SUT without touching the real process.env.",
          "is_bot": false,
          "headline": "Make subagent MCP visibility holistic + add ~100-token peer/advisor a…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-05-21T23:51:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fcbf0446078b2407b56d81b04e7e654f96df7cbd",
          "body": "…in11 as primary CI target (#32)\n\n* Fix Windows EPERM in ensureSharedSymlink by using junction type\n\n`fs.symlink(source, temp)` without a third arg defaults to `'file'` (or\n`'dir'` if target stats as dir) on Windows — both require admin or\nDeveloper Mode and throw EPERM for ordinary users. The catch\n[…]\nt:all` — clean\n- `bun test tests/lib-paths.test.ts` — 36 pass / 0 fail (no new\n  tests; +19 sanity expects spread across existing 8 tests)\n- `bun test` (full suite) — 628 pass / 0 fail across 46 files",
          "is_bot": false,
          "headline": "Fix Windows EPERM in ensureSharedSymlink with junctions + establish W…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-05-18T08:32:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b41539aca96fa149daadc877779ecddb7bcffe4a",
          "body": "…_POLICY (#31)\n\n* docs: slim CLAUDE.md from 304 to 117 lines, move reference content to docs/\n\nCLAUDE.md is loaded as a system prompt on every Claude Code conversation in\nthis repo. The previous version was doing two jobs: operational constraints\nthat an agent must see every turn (Review checklist, \n[…]\nalogous to .credentials.json, statsig/, cache/). Adds three\npinned regression-guard tests so future contributors can't silently revert. Updates the\nCLAUDE.md ISOLATED bullet to document the rationale.",
          "is_bot": false,
          "headline": "Slim CLAUDE.md (304→117) + pin jobs/daemon as ISOLATED in CLAUDE_HOME…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-05-15T21:27:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d3491d63c5c1b2cad204b1fc5527e4948a187d84",
          "body": "… for transparent xhigh (#28)\n\n* Cap codex_critic effort at high; add opus_critic peer; pre-flight latency cap\n\nPhase A — fix the gpt-5.5-times-out problem at the source (empirical 2026-05-14:\nxhigh on a tiny prompt = 56s, right at the 60s MCP per-tool-call ceiling\ndocumented by Claude Code regressi\n[…]\n only place that\nexplains *why* the contract exists — were both unprotected.\n\nAdd: (1) verbatim assertion across PERSONAS_WRITE, (2) verbatim +\nfresh-context assertions on the coordinator description.",
          "is_bot": false,
          "headline": "Cap codex_critic effort, add opus_critic peer, ship SSE-streamed /mcp…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-05-15T04:19:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9d3086ccb60bede3f829046970c208a3467c62a5",
          "body": "…trix (#27)\n\nPhase 0: getClaudeCodeEnvVars auto-enables FINE_GRAINED_TOOL_STREAMING which\nmakes Claude Code emit eager_input_streaming on every custom tool. Copilot\nreturns 400 \"tools.0.custom.eager_input_streaming: Extra inputs are not\npermitted\", silently breaking subagents. Extend stripAnthropicO\n[…]\near_tool_uses_\n20250919, text_editor_20250728, bash_20250124, web_search_20250305 in\nbody; rejects bash_20241022, code_execution_20250825. Probes verified\nlive against api.enterprise.githubcopilot.com",
          "is_bot": false,
          "headline": "Strip tools[i].eager_input_streaming and add Copilot compatibility ma…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-05-14T14:00:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3e6f7f5cfe916171467d18d4a62e5ebbe4affddc",
          "body": "* Fix agent-teams: spawn teammates with auth via CLAUDE_CONFIG_DIR mirror\n\nClaude Code v2.1.140's teammate-spawn rebuilds the child env from a\nfixed allowlist that drops ANTHROPIC_AUTH_TOKEN, leaving spawned\nteammates at \"Not logged in · Run /login\" — empirically verified by\nspinning up a smoke-test\n[…]\ned.\n\nPer advisor follow-up after the smoke-test session that hit the manual-\ncleanup friction firsthand: the original warn-and-skip-for-all-real-dirs\nbehavior was over-conservative for the empty case.",
          "is_bot": false,
          "headline": "Mirror CLAUDE_CONFIG_DIR to fix agent-teams auth and chat history (#26)",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-05-13T06:00:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6c40feeddc6e94052257798c356cdd23174be034",
          "body": "…cal audit) (#25)\n\n* Phase A: empirically-verified beta + env + model fixes (cc-backup substrate)\n\nCloses 5 P0 gaps identified via direct API calls against\napi.enterprise.githubcopilot.com on 2026-05-11. Each change is grounded\nin a measured Currently → After-fix transition (see plan file).\n\nsrc/lib\n[…]\n; isolated step\nruns the 70 remaining tests separately, all pass. Together with\nthe prior two commits (execFile-mock and node:os-mock fixes) and\nthe Bun bump, this should take CI from 7 fail → 0 fail.",
          "is_bot": false,
          "headline": "Make github-router a complete Claude Code substrate (cc-backup empiri…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-05-12T21:03:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0a17240f121621cfe98e8b94fd2e369f62be3e1e",
          "body": "…ating Copilot tags (#24)\n\nClaude Code dispatches background and small-model work using Anthropic's\npublished slugs (e.g. claude-haiku-4-5-20251001, claude-sonnet-4-5-20250929,\nclaude-sonnet-4-6-YYYYMMDD), which carry a -YYYYMMDD suffix. Copilot's\ncatalog only ships the floating tags (claude-haiku-4\n[…]\nixes\n- explicit pinning wins when catalog has both dated and floating ids\n- info breadcrumb fires once, no warn on the success path\n- regression: legacy not-found warning suppressed for the haiku case",
          "is_bot": false,
          "headline": "Resolve Anthropic dated slugs (claude-haiku-4-5-20251001 etc.) to flo…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-05-11T06:37:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ef7c2e5ed0ce9244ca645c05558f7c561ed54515",
          "body": "* Harden streaming pipe: bound upstream stalls + structured error events\n\nAddresses four observed failure modes from production sessions where a\nstreaming Copilot upstream gets cut mid-flight (TLS RST, undici terminated,\nidle timeout) and the proxy surfaces it as a runtime fetch crash rather\nthan a \n[…]\nhanged\n- #10 (PID-wraparound false-retention) — accepted, same as\n  sweepStaleRuntimeFiles\n\n411 tests pass (+3 Phase 2.6 regression tests + 1 concurrent-launch\nisolation test); typecheck + lint clean.",
          "is_bot": false,
          "headline": "Harden streaming pipe for weeks-long uptime (#23)",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-05-11T01:10:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bfc4fcef6c41508fc5f4436e401a56524c5be07c",
          "body": "…pass (#21)\n\n* Default to Opus 4.7 / GPT 5.5; fix Copilot beta-list and /models passthrough\n\n- claude subcommand defaults to claude-opus-4.7 (auto-upgrades to\n  claude-opus-4.7-1m-internal on enterprise tokens when no --model given;\n  explicit --model is respected as-is).\n- codex subcommand defaults\n[…]\nhe Anthropic slug for correct UI labels.\n\nVerification: typecheck clean, lint clean, 301 pass / 0 fail / 311 total\n(was 299 / 0 / 309; +2 new tests). Live TTY verification by user\nexpected post-merge.",
          "is_bot": false,
          "headline": "Default to Opus 4.7 / GPT 5.5; rewrite /search to MCP; harden auth by…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-05-04T21:10:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "80e440a6b6975fdcba2d22ed8d5006a07a791205",
          "body": null,
          "is_bot": false,
          "headline": "Update docs: OIDC publishing, dynamic version fetching",
          "author_name": "Ani",
          "author_login": null,
          "committed_at": "2026-03-31T22:06:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "300adadb364cb325d5cb367b734a9d5ce3368f1b",
          "body": "- Auto-fetch Copilot Chat extension version from VS Code marketplace\n  at startup (with hardcoded fallback). Keeps fingerprint current.\n- Fix sanitizeCacheControl to return boolean — avoids unnecessary\n  JSON round-tripping when \"scope\" appears in message text only\n- Add E2E tests for cache_control.scope stripping and false-positive\n  avoidance",
          "is_bot": false,
          "headline": "Auto-fetch Copilot version, fix scope stripping, add tests",
          "author_name": "Ani",
          "author_login": null,
          "committed_at": "2026-03-31T21:37:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "79cf143717f5be118f2c2b0300acbb936e23e3b4",
          "body": "npm 10.9.x (Node 22) only supports OIDC for provenance signing, not\npublish auth. Node 24 ships with npm 11.11.0 which supports true OIDC\ntrusted publishing. Removing registry-url prevents setup-node from\nwriting a placeholder _authToken that overrides the OIDC flow.",
          "is_bot": false,
          "headline": "Fix OIDC publish: use Node 24 (npm 11.11.0) and remove registry-url",
          "author_name": "Ani",
          "author_login": null,
          "committed_at": "2026-03-31T18:55:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "12496781b070cb99f1e8b5e96aa522c40f2dd526",
          "body": null,
          "is_bot": false,
          "headline": "Fix OIDC publish: remove empty NODE_AUTH_TOKEN override",
          "author_name": "Ani",
          "author_login": null,
          "committed_at": "2026-03-31T11:23:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ffcdb4c40b9b05383158d68283ab7cd76f82b78a",
          "body": "Trusted Publishing is already configured on npmjs.org for\nanimeshkundu/github-router + release.yml. Uses GitHub's OIDC\nidentity token instead of a long-lived NPM_TOKEN secret.\n\n- Add actions/setup-node with registry-url for OIDC .npmrc setup\n- Add --provenance flag to npm publish for attestation\n- Remove NPM_TOKEN-based .npmrc auth step\n- Add id-token: write permission at job level",
          "is_bot": false,
          "headline": "Switch npm publish to OIDC trusted publishing (no token needed)",
          "author_name": "Ani",
          "author_login": null,
          "committed_at": "2026-03-31T11:20:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d85f8f8f97217f9b804619b96cded326b7c29eb5",
          "body": "The CI was publishing as @animeshkundu/github-router (scoped) instead\nof github-router (unscoped). Now rewrites package.json name before\nnpm publish and restores afterwards, matching publish/release.sh.\n\nAlso fixes: version bump check against correct (unscoped) package name,\nnpm auth via ~/.npmrc instead of env var.",
          "is_bot": false,
          "headline": "Fix release workflow to publish unscoped github-router package",
          "author_name": "Ani",
          "author_login": null,
          "committed_at": "2026-03-31T11:12:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c9c558d60b608fd25557dabff591e04af3e9e43f",
          "body": "* Fix Claude CLI 2.1.88+ compatibility with Copilot proxy\n\nRoot cause: CLI sends cache_control.scope field that Copilot rejects\nwith 400. Also, beta header whitelist was too narrow, error format\ndidn't match Anthropic SDK, and VS Code fingerprint was outdated.\n\nChanges:\n- Strip cache_control.scope f\n[…]\nfields\n- API-REFERENCE.md: Add body sanitization, beta filtering, error format,\n  HEAD / health check, messages-specific headers\n- DEVELOPMENT.md: Add --extended-betas flag, update error handling docs",
          "is_bot": false,
          "headline": "Fix Claude CLI 2.1.88+ compatibility (#19)",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-03-31T11:05:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4325b1d202f927b63dbd3c54b33e8c6fe9ed8c7b",
          "body": "The canonical npm package is the unscoped \"github-router\", not the\nscoped @animeshkundu/github-router. Add publish/release.sh that builds,\ntests, temporarily rewrites package.json to the unscoped name, publishes,\nand restores. Requires NPM_TOKEN env var — no credentials in the repo.\n\nDocument the publishing workflow in CLAUDE.md and update the release\nscript reference in package.json.",
          "is_bot": false,
          "headline": "Add publish script for unscoped github-router package",
          "author_name": "anikundu",
          "author_login": null,
          "committed_at": "2026-03-05T05:34:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c2ddbb2d10f6ee32086a7f16506eff5959ca30b1",
          "body": null,
          "is_bot": false,
          "headline": "Bump version to 0.3.10 (republish with correct build)",
          "author_name": "anikundu",
          "author_login": null,
          "committed_at": "2026-03-05T05:08:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cd91aa599e6dcf3111ed85f641dd0fab55212236",
          "body": "- Synthetic compaction for /responses/compact: when Copilot API returns\n  404, fall back to sending conversation history to /responses with a\n  summarization prompt, returning the model's summary in compact format.\n  Native compact is tried first for forward compatibility.\n\n- Fix process cleanup: ch\n[…]\nstderr.write() are unaffected.\n\n- Fix publish: make prepare script resilient (simple-git-hooks || true),\n  remove token interpolation from project .npmrc, fix bin entry path.\n\n- Bump version to 0.3.9.",
          "is_bot": false,
          "headline": "Release 0.3.9: synthetic compaction, process cleanup, publish fixes",
          "author_name": "anikundu",
          "author_login": null,
          "committed_at": "2026-03-04T21:51:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cc0605756224f7cd7b7721f0bdc7125b0f38d58d",
          "body": null,
          "is_bot": false,
          "headline": "Bump version to 0.3.8",
          "author_name": "anikundu",
          "author_login": null,
          "committed_at": "2026-03-04T11:28:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d41794e8c908f575ba217d507429f41dad8666c8",
          "body": "When running `github-router claude` or `github-router codex`, proxy\nerrors and warnings were either lost (silenced by consola.level = -Infinity)\nor printed to terminal corrupting the TUI.\n\nReplace the blanket silence with a custom ConsolaReporter that writes\nerrors and warnings to ~/.local/share/git\n[…]\nmissions 0o600 on every write\n- Log rotation at 1MB (rename to .1, start fresh)\n\nFatal errors in launchChild also write to stderr directly so the user\nsees them even when consola is in file-only mode.",
          "is_bot": false,
          "headline": "Add file-based error/warning logging for TUI mode",
          "author_name": "anikundu",
          "author_login": null,
          "committed_at": "2026-03-04T11:27:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f64e44ef551208ca19263587fa10a4f542c1d482",
          "body": "Set consola.level to -Infinity (fully silent) before launching child\nCLI processes, preventing any log output from corrupting the TUI.\nPreviously level 1 still allowed error/warn messages through.\n\nSwitch package registry from GitHub Packages to npmjs for publishing.",
          "is_bot": false,
          "headline": "Silence proxy logs during claude/codex TUI and switch to npmjs registry",
          "author_name": "anikundu",
          "author_login": null,
          "committed_at": "2026-03-04T10:39:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9a6e84a44cf83ef294c2bef85829ae457c4f809c",
          "body": "* Fix codex model resolution and add endpoint validation\n\nDEFAULT_CODEX_MODEL was \"gpt5.3-codex\" but the actual Copilot API model\nID is \"gpt-5.3-codex\". This caused a cascade of silent failures: model\nlookup always returned undefined, metadata was never applied, and the\nwrong name was sent to both C\n[…]\n gpt-5.3-codex\n\nTests:\n- Add DEFAULT_CODEX_MODEL value assertion\n- Add E2E test for models with missing capabilities (?.safety)\n\n---------\n\nCo-authored-by: anikundu <anikundu@microsoft.com_msteamsmdb>",
          "is_bot": false,
          "headline": "Fix codex model resolution and add endpoint validation (#17)",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-03-03T22:06:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c6584c7f4729d1f44b957789170bb7d66daa2d01",
          "body": "* Replace Bun-only APIs in launchChild with node:child_process\n\nlaunchChild used Bun.which() and Bun.spawn() which crash with\n\"Bun is not defined\" when running via npx (Node.js). Replace with\nnode:child_process spawn/execFileSync that work in both runtimes.\nUses shell mode on Windows for .cmd script\n[…]\ns the Copilot API base URL\n- E2E smoke test now starts a mock API server that handles /token,\n  /user, /models, and /chat/completions — no real auth needed\n- Removes GH_TOKEN secret dependency from CI",
          "is_bot": false,
          "headline": "Replace Bun-only APIs in launchChild with node:child_process (#14)",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-02-14T10:52:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0db34b715de49543dfb70f775a048a35ea8065f6",
          "body": "setupAndServe() read srvxServer.url immediately after serve(), but\nsrvx does not populate the url property until ready() resolves. Add\nawait srvxServer.ready() before reading the URL, and remove the\nnow-redundant ready() calls from the claude and codex subcommands.\n\nFixes: \"Server started but URL is not available\" crash introduced in\n384a451.",
          "is_bot": false,
          "headline": "Fix server URL not available by awaiting srvx ready() (#13)",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-02-14T08:37:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "384a451dab1db7d3ecf8b6623e223763f6d57141",
          "body": "* Add claude/codex subcommands and fix unhandled rejection crash\n\nAdd `github-router claude` and `github-router codex` subcommands that\nstart the proxy server on a random available port and launch the\nrespective CLI tool as a child process with the correct env vars.\nSupports `--` passthrough for ext\n[…]\nd child.exited .then() chains\n- Add process.on(\"uncaughtException\") handler\n- Extract DEFAULT_CODEX_MODEL constant to eliminate duplication\n- Clean up port.ts: remove misleading JSDoc and dead exports",
          "is_bot": false,
          "headline": "Add claude/codex subcommands and fix unhandled rejection crash (#12)",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-02-14T07:46:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "89dd37a141b2d944c4f7a50d05916aa4dceda1e6",
          "body": "…ng (#11)\n\nChanges verified by adversarial code review against decompiled VS Code\nCopilot Chat v0.38:\n\n- Remove re-introduced Openai-Organization header from /chat/completions\n  (VS Code only sends it on legacy proxy, not CAPI)\n- Override openai-intent and x-interaction-type to \"conversation-agent\"\n\n[…]\n the client\n  sends none (safety net for bare clients; Claude CLI sends its own)\n- Add red [MISMATCH] logging when API rejects with token/context errors\n  that contradict /models metadata capabilities",
          "is_bot": false,
          "headline": "Refine VS Code fingerprint, forward model headers, add mismatch loggi…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-02-13T23:32:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f93c4da39ff8ad7eb79cb816a88d8f81798ab8a2",
          "body": "* Forward beta headers, handle web_search, and improve --claude-code UX\n\n- Forward anthropic-beta and capi-beta-1 headers from incoming requests\n  to Copilot API, matching VS Code Copilot Chat extension behavior\n- Append ?beta=true to /v1/messages and /v1/messages/count_tokens URLs\n- Handle web_sear\n[…]\nodel resolution,\ninput/output tokens, context window fill %, status, and duration.\n\nDefault account type changed to enterprise.\n\n---------\n\nCo-authored-by: anikundu <anikundu@microsoft.com_msteamsmdb>",
          "is_bot": false,
          "headline": "Match VS Code fingerprint, resolve opus→1M, single-line logging (#10)",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-02-13T19:38:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f26626ba52ab13ae06fe7538b8367037c25d63f6",
          "body": "….38 fingerprint (#9)\n\n* Forward beta headers, handle web_search, and improve --claude-code UX\n\n- Forward anthropic-beta and capi-beta-1 headers from incoming requests\n  to Copilot API, matching VS Code Copilot Chat extension behavior\n- Append ?beta=true to /v1/messages and /v1/messages/count_tokens\n[…]\n and VScode-MachineId persistent headers\n- Add Openai-Organization header to chat completions\n- Add token-counting- to allowed beta prefixes\n- Remove dead capi-beta-1 header forwarding (gone in v0.38)",
          "is_bot": false,
          "headline": "Forward beta headers, handle web_search, and match VS Code Copilot v0…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-02-13T13:23:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5dde842bad462920fdf3717f54b8beb76ba3783f",
          "body": "… (#8)\n\n- Forward anthropic-beta and capi-beta-1 headers from incoming requests\n  to Copilot API, matching VS Code Copilot Chat extension behavior\n- Append ?beta=true to /v1/messages and /v1/messages/count_tokens URLs\n- Handle web_search tools in Anthropic Messages format: detect versioned\n  tool ty\n[…]\nnstead of showing\n  all models; default to opus (main) and haiku (small)\n- Use ANTHROPIC_AUTH_TOKEN only (no duplicate API key warning)\n- Add --dangerously-skip-permissions to generated claude command",
          "is_bot": false,
          "headline": "Forward beta headers, handle web_search, and improve --claude-code UX…",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-02-13T12:25:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "936bb8fa9f6ffd79780619091b384dbbb668308c",
          "body": "Commands generated with --claude-code and --codex are now always\nprinted in a box, in addition to being copied to clipboard.\n\nShell detection on Windows replaces deprecated wmic with env-var\nheuristics: SHELL for Git Bash/MSYS2, POWERSHELL_DISTRIBUTION_CHANNEL\nfor Windows PowerShell 5.x, and PSModulePath user-scoped paths for\nPowerShell 7+/pwsh. Falls back to CMD.",
          "is_bot": false,
          "headline": "Always print CLI commands to console and improve shell detection (#6)",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-02-13T11:02:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "030e0e899f8c91cb62ecb387df0e584be066c484",
          "body": "- Add continue-on-error to version bump push (npm publish and GitHub\n  release still succeed even if push to protected master is blocked)\n- Support optional PAT secret for checkout (bypasses branch protection)\n- Sync package.json to 0.3.2 (matching npm)\n- Bump loop handles multiple published versions ahead of repo",
          "is_bot": false,
          "headline": "Fix release: make push non-fatal, support PAT for bypass",
          "author_name": "anikundu",
          "author_login": null,
          "committed_at": "2026-02-13T10:38:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4193f8b28381348da79bae88afa0544847c09f4a",
          "body": "Set package.json to 0.3.1 (matching what's already on npm after the\npartial release). Change the bump logic to loop until it finds an\nunpublished version, preventing failures when multiple versions have\nbeen published ahead of the repo.",
          "is_bot": false,
          "headline": "Fix release: sync version to 0.3.1 and loop bump until unpublished",
          "author_name": "anikundu",
          "author_login": null,
          "committed_at": "2026-02-13T10:36:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e6692d2575ee763dda0237a6fbbdf0d212af93e3",
          "body": null,
          "is_bot": false,
          "headline": "Allow manual release workflow trigger via workflow_dispatch",
          "author_name": "anikundu",
          "author_login": null,
          "committed_at": "2026-02-13T10:32:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0b4741df98313b7d54dae4680647286e2db1a0e0",
          "body": "* Move entrypoint.sh and start.bat to docker/\n\nUpdate Dockerfile COPY path and .npmignore accordingly.\n\n* Passthrough /v1/messages to Copilot's native Anthropic endpoint\n\nReplace the Anthropic→OpenAI translation layer with a direct passthrough\nto Copilot's native /v1/messages endpoint. Copilot nativ\n[…]\nrelease and docker jobs now depend on publish-npm to use the\npost-bump version consistently across all artifacts.\n\n* trigger CI\n\n---------\n\nCo-authored-by: anikundu <anikundu@microsoft.com_msteamsmdb>",
          "is_bot": false,
          "headline": "Passthrough /v1/messages to Copilot native Anthropic endpoint (#5)",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-02-13T10:30:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c39610a47b4c062c572e5d9ff2a7eac18684b874",
          "body": "This reverts commit 5d4cc8d343194d53b72daa7bab547a0a92a62300.",
          "is_bot": false,
          "headline": "Revert \"Auto-bump version on release and always print CLI commands (#3)\"",
          "author_name": "anikundu",
          "author_login": null,
          "committed_at": "2026-02-13T08:40:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5d4cc8d343194d53b72daa7bab547a0a92a62300",
          "body": "* Auto-bump version on release and always print CLI commands\n\n- Release workflow: auto-bump patch version when current version is\n  already published on npm, commit bump back to master with [skip ci]\n  to prevent recursive triggers\n- Reorder github-release and docker jobs to depend on publish-npm\n  \n[…]\ntests for all Claude Code /model menu selections\n  (Default, Opus, Opus 1M, Sonnet 1M, Haiku, sub-agent variants)\n\n* Trigger CI\n\n---------\n\nCo-authored-by: anikundu <anikundu@microsoft.com_msteamsmdb>",
          "is_bot": false,
          "headline": "Auto-bump version on release and always print CLI commands (#3)",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-02-13T08:36:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "668dd395494645ed8fa6a4363ff1ebbc4e79bfb4",
          "body": "Replace the brittle translateModelName() with normalizeCopilotModelName()\nthat correctly handles Anthropic dash-notation (claude-opus-4-6) by\nconverting to Copilot dot-notation (claude-opus-4.6), strips date\nsuffixes, and falls back to claude-opus-4.6 for unknown Claude models.\n\nAlso fixes response model name leak where Copilot display names\n(\"Claude Haiku 4.5\") were returned instead of the client-sent model ID.",
          "is_bot": false,
          "headline": "Fix Claude model name translation for CLI compatibility (#2)",
          "author_name": "Animesh",
          "author_login": "animeshkundu",
          "committed_at": "2026-02-13T08:00:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 83,
      "commits_last_year": 102,
      "latest_release_at": "2026-07-17T05:29:58Z",
      "latest_release_tag": "v0.3.212",
      "releases_from_tags": false,
      "days_since_last_push": 4,
      "active_weeks_last_year": 17,
      "days_since_latest_release": 4,
      "mean_days_between_releases": 1.1
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "@animeshkundu/github-router",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "proxy",
            "github-copilot",
            "openai-compatible",
            "anthropic-compatible",
            "claude-code",
            "codex",
            "reverse-proxy",
            "copilot"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@animeshkundu/github-router",
          "is_deprecated": false,
          "latest_version": "0.3.10",
          "repository_url": "https://github.com/animeshkundu/github-router",
          "versions_count": 4,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 43,
          "first_published_at": "2026-03-04T10:38:26.288000Z",
          "latest_published_at": "2026-03-05T05:08:26.244000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 138
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 4,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [
          {
            "date": "2026-05-07",
            "count": 1
          },
          {
            "date": "2026-06-24",
            "count": 2
          },
          {
            "date": "2026-07-09",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 4,
        "total_stars": 4
      },
      "open_issues_and_prs": 6
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": true,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 139191,
      "source_files_sampled": 496,
      "oversized_source_files": 16,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 79799
    },
    "dependencies": {
      "manifests": [
        "package.json"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [
          {
            "name": "srvx",
            "direct": true,
            "version": "0.8.16",
            "severity": "moderate",
            "ecosystem": "npm",
            "cvss_score": 4.8,
            "advisory_ids": [
              "GHSA-p36q-q72m-gchr"
            ],
            "fixed_version": "0.11.13",
            "advisory_count": 1,
            "oldest_advisory_days": 117
          }
        ],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {
          "moderate": 1
        },
        "advisory_count": 1,
        "affected_count": 1,
        "assessed_count": 60,
        "malicious_count": 0,
        "assessed_package": "npm:@animeshkundu/github-router@0.3.10",
        "unassessed_count": 0,
        "direct_affected_count": 1
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "@vscode/ripgrep",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.18.0"
        },
        {
          "name": "citty",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.1.6"
        },
        {
          "name": "clipboardy",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.3.1"
        },
        {
          "name": "consola",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.4.2"
        },
        {
          "name": "fetch-event-stream",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.1.6"
        },
        {
          "name": "gpt-tokenizer",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.4.0"
        },
        {
          "name": "hono",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.12.23"
        },
        {
          "name": "ignore",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "7.0.5"
        },
        {
          "name": "marked",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^18.0.5"
        },
        {
          "name": "partial-json",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "0.1.7"
        },
        {
          "name": "proxy-from-env",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.1.0"
        },
        {
          "name": "srvx",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.8.16"
        },
        {
          "name": "tree-sitter-wasms",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.1.13"
        },
        {
          "name": "typebox",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "1.1.38"
        },
        {
          "name": "undici",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.27.0"
        },
        {
          "name": "web-tree-sitter",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "0.22.6"
        },
        {
          "name": "ws",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^8.21.0"
        },
        {
          "name": "yaml",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "2.9.0"
        },
        {
          "name": "zod",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.4.3"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "@vscode/ripgrep",
            "direct": true,
            "version": "^1.18.0",
            "ecosystem": "npm"
          },
          {
            "name": "citty",
            "direct": true,
            "version": "^0.1.6",
            "ecosystem": "npm"
          },
          {
            "name": "clipboardy",
            "direct": true,
            "version": "^5.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "consola",
            "direct": true,
            "version": "^3.4.2",
            "ecosystem": "npm"
          },
          {
            "name": "fetch-event-stream",
            "direct": true,
            "version": "^0.1.6",
            "ecosystem": "npm"
          },
          {
            "name": "gpt-tokenizer",
            "direct": true,
            "version": "^3.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "hono",
            "direct": true,
            "version": "^4.12.23",
            "ecosystem": "npm"
          },
          {
            "name": "ignore",
            "direct": true,
            "version": "7.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "marked",
            "direct": true,
            "version": "^18.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "partial-json",
            "direct": true,
            "version": "0.1.7",
            "ecosystem": "npm"
          },
          {
            "name": "proxy-from-env",
            "direct": true,
            "version": "^1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "srvx",
            "direct": true,
            "version": "^0.8.16",
            "ecosystem": "npm"
          },
          {
            "name": "tree-sitter-wasms",
            "direct": true,
            "version": "^0.1.13",
            "ecosystem": "npm"
          },
          {
            "name": "typebox",
            "direct": true,
            "version": "1.1.38",
            "ecosystem": "npm"
          },
          {
            "name": "undici",
            "direct": true,
            "version": "^7.27.0",
            "ecosystem": "npm"
          },
          {
            "name": "web-tree-sitter",
            "direct": true,
            "version": "0.22.6",
            "ecosystem": "npm"
          },
          {
            "name": "ws",
            "direct": true,
            "version": "^8.21.0",
            "ecosystem": "npm"
          },
          {
            "name": "yaml",
            "direct": true,
            "version": "2.9.0",
            "ecosystem": "npm"
          },
          {
            "name": "zod",
            "direct": true,
            "version": "^4.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/js",
            "direct": false,
            "version": "^9.39.4",
            "ecosystem": "npm"
          },
          {
            "name": "@types/bun",
            "direct": false,
            "version": "^1.3.14",
            "ecosystem": "npm"
          },
          {
            "name": "@types/proxy-from-env",
            "direct": false,
            "version": "^1.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "@types/ws",
            "direct": false,
            "version": "^8.18.1",
            "ecosystem": "npm"
          },
          {
            "name": "eslint",
            "direct": false,
            "version": "^9.39.4",
            "ecosystem": "npm"
          },
          {
            "name": "eslint-config-prettier",
            "direct": false,
            "version": "^10.1.8",
            "ecosystem": "npm"
          },
          {
            "name": "knip",
            "direct": false,
            "version": "^5.88.1",
            "ecosystem": "npm"
          },
          {
            "name": "lint-staged",
            "direct": false,
            "version": "^16.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "playwright",
            "direct": false,
            "version": "^1.60.0",
            "ecosystem": "npm"
          },
          {
            "name": "prettier-plugin-packagejson",
            "direct": false,
            "version": "^2.5.22",
            "ecosystem": "npm"
          },
          {
            "name": "simple-git-hooks",
            "direct": false,
            "version": "^2.13.1",
            "ecosystem": "npm"
          },
          {
            "name": "tsdown",
            "direct": false,
            "version": "^0.15.12",
            "ecosystem": "npm"
          },
          {
            "name": "typescript",
            "direct": false,
            "version": "^5.9.3",
            "ecosystem": "npm"
          },
          {
            "name": "typescript-eslint",
            "direct": false,
            "version": "^8.60.1",
            "ecosystem": "npm"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 33,
        "direct_count": 19,
        "indirect_count": 14
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 6,
        "merged_prs": 82,
        "open_issues": 0,
        "closed_ratio": 1,
        "closed_issues": 1,
        "closed_unmerged_prs": 9
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "animeshkundu",
          "commits": 82,
          "avatar_url": "https://avatars.githubusercontent.com/u/7248674?v=4"
        },
        {
          "type": "User",
          "login": "animeshk",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/2742175?v=4"
        }
      ],
      "contributors_sampled": 2,
      "top_contributor_share": 0.965
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "deploy-pages.yml",
        "release.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        "eslint.config.js"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "27 out of 27 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/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": 10,
            "reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "26 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "3c05339898293bc3d589f738eec8b509a7495f94",
        "ran_at": "2026-07-22T02:06:12Z",
        "aggregate_score": 3.7,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-17T05:31:37Z",
      "oldest_open_prs": [
        {
          "number": 15,
          "created_at": "2026-02-18T03:54:39Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 16,
          "created_at": "2026-02-18T03:54:46Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 18,
          "created_at": "2026-03-07T01:53:34Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 49,
          "created_at": "2026-06-01T06:28:05Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 89,
          "created_at": "2026-07-07T19:45:19Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 98,
          "created_at": "2026-07-17T19:26:29Z",
          "last_comment_at": "2026-07-17T22:44:54Z",
          "last_comment_author": "animeshkundu"
        }
      ],
      "last_merged_pr_at": "2026-07-17T05:24:08Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/animeshkundu/github-router",
    "host": "github.com",
    "name": "github-router",
    "owner": "animeshkundu"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 62,
      "inputs": {
        "security": 46,
        "vitality": 86,
        "community": 27,
        "governance": 57,
        "engineering": 86
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 86,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 76,
            "inputs": {
              "commits_last_year": 102,
              "human_commit_share": 1,
              "days_since_last_push": 4,
              "active_weeks_last_year": 17
            },
            "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": "17/52 weeks with commits",
                "points": 11.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 17
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "102 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 102
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "releases_count": 83,
              "latest_release_tag": "v0.3.212",
              "releases_from_tags": false,
              "days_since_latest_release": 4,
              "mean_days_between_releases": 1.1
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "83 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 83
                    }
                  }
                ],
                "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 ~1.1 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 1.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": "critical",
        "name": "Community & Adoption",
        "value": 27,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 8,
            "inputs": {
              "forks": 0,
              "stars": 4,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "below_threshold"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "4 stars",
                "points": 7.7,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "critical",
            "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": 27,
            "inputs": {
              "packages": [
                "@animeshkundu/github-router"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 43
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "43 downloads/month across npm",
                "points": 21.9,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 43,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 57,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 16,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 2,
              "top_contributor_share": 0.965
            },
            "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 96% of commits",
                "points": 0.8,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 96
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "2 contributors",
                "points": 2.7,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 81,
            "inputs": {
              "merged_prs": 82,
              "open_issues": 0,
              "closed_issues": 1,
              "issue_closed_ratio": 1,
              "closed_unmerged_prs": 9
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "100% of issues closed",
                "points": 46.8,
                "status": "met",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "82/91 decided PRs merged",
                "points": 34.5,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 82,
                      "decided": 91
                    }
                  }
                ],
                "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": 56,
            "inputs": {
              "followers": 40,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "animeshkundu",
              "public_repos": 35,
              "account_age_days": 4485
            },
            "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": "40 followers of animeshkundu",
                "points": 11.6,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 40,
                      "login": "animeshkundu"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "35 public repos, account ~12 yr old",
                "points": 23.3,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 35
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 12
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "packages": [
                "@animeshkundu/github-router"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 138
            },
            "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 138 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 138
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "4 published versions",
                "points": 12,
                "status": "partial",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "excellent",
        "name": "Engineering Quality",
        "value": 86,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 84,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "3 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": "eslint.config.js",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "eslint.config.js"
                    }
                  }
                ],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "27 out of 27 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "topics": [
                "anthropic",
                "claude-code",
                "github-copilot",
                "openai",
                "proxy",
                "claude-cli",
                "codex",
                "codex-cli"
              ],
              "has_wiki": false,
              "homepage": "https://animesh.kundus.in/github-router/",
              "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://animesh.kundus.in/github-router/",
                "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": "8 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 8
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 46,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 37,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 3.7
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "27 out of 27 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/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": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "26 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "good",
            "name": "Dependency advisories",
            "note": "Matched the npm:@animeshkundu/github-router@0.3.10 runtime dependency closure — what installing the published package pulls in — 60 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "npm:@animeshkundu/github-router@0.3.10",
                  "assessed": 60
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 82,
            "inputs": {
              "source": "osv",
              "advisories": 1,
              "affected_packages": 1,
              "assessed_packages": 60,
              "unassessed_packages": 0,
              "affected_by_severity": "moderate 1",
              "direct_affected_packages": 1
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "1 affected: srvx 0.8.16 (moderate 4.8)",
                "points": 21.6,
                "status": "partial",
                "details": [
                  {
                    "code": "advisories_affected",
                    "params": {
                      "count": 1,
                      "packages": "srvx 0.8.16 (moderate 4.8)"
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "no indirect dependency carries a known advisory",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "no_indirect_advisories",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "1 advisory-carrying package(s) unaddressed past 90 days; oldest published 117 days ago",
                "points": 35.7,
                "status": "partial",
                "details": [
                  {
                    "code": "advisories_stale",
                    "params": {
                      "days": 90,
                      "count": 1,
                      "oldest": 117
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 60,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 3
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 66,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.94,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 79799
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.md"
                    }
                  }
                ],
                "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": "94 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 94,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 56,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": true,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "tsconfig.json"
              ],
              "agent_commit_share": 0.01,
              "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": "tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Dockerfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "1 of the last 100 commits agent-authored or agent-credited",
                "points": 2,
                "status": "partial",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 1,
                      "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": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 98,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 139191,
              "source_files_sampled": 496,
              "oversized_source_files": 16
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "TypeScript (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "TypeScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "16/496 source files over 60KB",
                "points": 53.2,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 496,
                      "oversized": 16
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "critical",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 20,
            "inputs": {
              "example_dirs": [],
              "has_mcp_signal": true,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [],
  "report_type": "repository",
  "generated_at": "2026-07-22T02:06:28.954792Z",
  "schema_version": "0.26.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/a/animeshkundu/github-router.svg",
  "full_name": "animeshkundu/github-router",
  "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.