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

ShortArrow / ivi-cli

VISA/IVI based instrument integrated CLI

C#Apache-2.0★ 0 Sterne⑂ 0 Forksseit Mai 2026Auf GitHub ansehen ↗

ShortArrow/ivi-cli erreicht einen Gesundheitsindex von 58 von 100 und liegt damit im Bereich Mittel. Am stärksten schneidet es bei Engineering Quality (80/100) ab, am schwächsten bei Community & Adoption (40/100). Zuletzt heute aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

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

58
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

ShortArrowPersönliches Konto
25 Follower161 öffentliche Reposseit Jan. 2016the Earth

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
NuGetivi-cli0.2.8-14vor 0 Tagenvisaiviscpihislipvxi-11cliinstrumenttest-automation

Metriken nach Kategorie

Vitalität

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

71Gut · 22 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 0 Tagen
4.8/36Commit-Rhythmus — 7/52 Wochen mit Commits
18/18Commit-Volumen — 217 Commits im letzten Jahr
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Verwendete Eingangsdaten
commits_last_year217
human_commit_share0,82
days_since_last_push0
active_weeks_last_year7
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 13 Releases veröffentlicht
36/36Release-Aktualität — letztes Release vor 0 Tagen
27/27Release-Rhythmus — ein Release etwa alle 5,5 Tage
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Verwendete Eingangsdaten
releases_count13
latest_release_tagv0.2.8
releases_from_tagsnein
days_since_latest_release0
mean_days_between_releases5,5

Community & Verbreitung

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

40Gefährdet · 18 % des Gesamtindex
Wie die Bewertung erfolgt
0/60Stars — 0 Stars
0/25Forks — 0 Forks
0/15Watcher — 0 Watcher
Verwendete Eingangsdaten
forks0
stars0
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (Apache-2.0)
18/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
0/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
has_contributingja
has_issue_templatenein
has_code_of_conductnein
has_pull_request_templatenein
Wie die Bewertung erfolgt
47.8/80Downloads gesamt — 40.134 Downloads insgesamt über nuget
0/20Abhängige in der Registry — von diesem Ökosystem nicht ausgewiesen
Verwendete Eingangsdaten
packagesivi-cli
dependents
ecosystemsnuget
total_downloads40.134
monthly_downloads
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?

47Gefährdet · 24 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
0/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 100 % der Commits
1.4/13.5Breite der Beitragenden — 1 Beitragende
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Verwendete Eingangsdaten
bus_factor1
contributors_sampled1
top_contributor_share1
Wie die Bewertung erfolgt
14.6/46.8Issue-Lösungsquote — 31 % der Issues geschlossen
21.5/38.3PR-Annahme — 40/71 entschiedene PRs gemergt
0/15OpenSSF Scorecard: Code-Review — Found 0/20 approved changesets -- score normalized to 0
Verwendete Eingangsdaten
merged_prs40
open_issues11
closed_issues5
issue_closed_ratio0,312
closed_unmerged_prs31
Wie die Bewertung erfolgt
10/30Organisatorische Trägerschaft — persönliches (Nutzer-)Konto
0/20Verifizierte Domain — für Nutzerkonten nicht anwendbar
10.2/25Reichweite des Inhabers — 25 Follower von ShortArrow
25/25Kontohistorie — 161 öffentliche Repos, Kontoalter ca. 10 Jahre
Verwendete Eingangsdaten
followers25
owner_typeUser
is_verified
owner_loginShortArrow
public_repos161
account_age_days3.824
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Verifizierte Domain. Die verbleibenden Gewichte wurden renormalisiert.

Paketpflege

100Exzellent
Wie die Bewertung erfolgt
25/25Veröffentlicht & auflösbar — 1 Paket(e) auf nuget
35/35Veröffentlichungsaktualität — letzte Veröffentlichung vor 0 Tagen
20/20Versionshistorie — 14 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packagesivi-cli
ecosystemsnuget
any_deprecatednein
min_days_since_publish0

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

80Gut · 20 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 4 Workflow(s)
24/24Tests vorhanden
0/16Linter-Konfiguration
0/9.6Pre-Commit-Hooks
6.4/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 29 out of 29 merged PRs checked by a CI test -- score normalized to 10
Verwendete Eingangsdaten
has_cija
has_testsja
has_editorconfigja
has_linter_confignein
has_precommit_confignein

Dokumentation

90Exzellent
Wie die Bewertung erfolgt
30/30README
25/25Dokumentationsverzeichnis
15/15Dokumentations-/Homepage-Site — https://www.nuget.org/packages/ivi-cli/
10/10Repository-Beschreibung
10/10Topics — 3 Topics
0/10Wiki
Verwendete Eingangsdaten
topicscli, ivi, visa
has_wikinein
homepagehttps://www.nuget.org/packages/ivi-cli/
has_readmeja
has_docs_dirja
has_descriptionja

Sicherheit

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

50Mittel · 16 % des Gesamtindex
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 — 29 out of 29 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/20 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
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Lizenz — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
5/5Packaging — packaging workflow detected
4.5/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 9
5/5SAST — SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate5

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.

62Mittel · 0 % des Gesamtindex
Wie die Bewertung erfolgt
0/45Agentenanweisungen — keine CLAUDE.md / AGENTS.md / Editor-Regeln
0/15Maschinenlesbare Doku (llms.txt)
40/40Lesbare Commit-Historie — 82 von 82 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share1
agent_instruction_files
agent_instruction_max_bytes
Wie die Bewertung erfolgt
12.6/18Bootstrap mit einem Befehl — src/IviCli.Api/IviCli.Api.csproj, src/IviCli.Application/IviCli.Application.csproj, src/IviCli.Backends.Fake/IviCli.Backends.Fake.csproj (Toolchain-Konvention, kein Task-Runner)
22/22Automatisierte Tests
0/11Lint-/Format-Konfiguration
11/11Statische Typprüfung — C# (statisch typisiert)
10/10Reproduzierbare Umgebung — Dockerfile, lockfile
0/10Belegte Agentenpraxis — keine von Agenten verfassten Commits unter den letzten 100
8/8Automatisierte Wartung — 18 der letzten 100 Commits sind automatisierte Abhängigkeits-Updates
9/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 9
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfilespackages.lock.json
has_dockerfileja
typed_languageja
bootstrap_files
has_devcontainernein
has_linter_confignein
typecheck_configs
agent_commit_share0
toolchain_manifestssrc/IviCli.Api/IviCli.Api.csproj, src/IviCli.Application/IviCli.Application.csproj, src/IviCli.Backends.Fake/IviCli.Backends.Fake.csproj, src/IviCli.Backends.HiSlip/IviCli.Backends.HiSlip.csproj, src/IviCli.Backends.Local/IviCli.Backends.Local.csproj, src/IviCli.Backends.Lxi/IviCli.Backends.Lxi.csproj, src/IviCli.Backends.Replay/IviCli.Backends.Replay.csproj, src/IviCli.Backends.Socket/IviCli.Backends.Socket.csproj, src/IviCli.Backends.Vxi11/IviCli.Backends.Vxi11.csproj, src/IviCli.Cli/IviCli.Cli.csproj, src/IviCli.Domain/IviCli.Domain.csproj, src/IviCli.Infrastructure/IviCli.Infrastructure.csproj, src/IviCli.Plugin/IviCli.Plugin.csproj, src/IviCli.Server/IviCli.Server.csproj, tests/IviCli.Api.Tests/IviCli.Api.Tests.csproj, tests/IviCli.Application.Tests/IviCli.Application.Tests.csproj, tests/IviCli.Backends.Fake.Tests/IviCli.Backends.Fake.Tests.csproj, tests/IviCli.Backends.Local.Tests/IviCli.Backends.Local.Tests.csproj, tests/IviCli.Backends.Replay.Tests/IviCli.Backends.Replay.Tests.csproj, tests/IviCli.Backends.Socket.Tests/IviCli.Backends.Socket.Tests.csproj, tests/IviCli.Backends.Vxi11.Tests/IviCli.Backends.Vxi11.Tests.csproj, tests/IviCli.Cli.Tests/IviCli.Cli.Tests.csproj, tests/IviCli.Domain.Tests/IviCli.Domain.Tests.csproj, tests/IviCli.Infrastructure.Tests/IviCli.Infrastructure.Tests.csproj, tests/IviCli.Plugin.Sample/IviCli.Plugin.Sample.csproj, tests/IviCli.Plugin.Tests/IviCli.Plugin.Tests.csproj, tests/IviCli.Server.Tests/IviCli.Server.Tests.csproj, tests/IviCli.TestKit/IviCli.TestKit.csproj
dependency_bot_commit_share0,18
Wie die Bewertung erfolgt
45/45Typprüfbarer Code — C# (statisch typisiert)
55/55Handhabbare Dateigrößen — 0/385 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languageC#
largest_source_bytes34.602
source_files_sampled385
oversized_source_files0
Wie die Bewertung erfolgt
0/40API-Schema (OpenAPI/GraphQL/proto)
0/20MCP-Server
40/40Lauffähige Beispiele — samples
Verwendete Eingangsdaten
example_dirssamples
has_mcp_signalnein
api_schema_files

Eckdaten

0GitHub-Sterne
1Mitwirkende
217Commits, letzte 12 Monate
0Tage seit letztem Push
13Releases
1Bus-Faktor
11offene Issues
Paket-Ökosysteme

Warnungen zur Datenerhebung

  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Weitere Details

OpenSSF Scorecard 5.0 / 10
5.0Gesamtwert

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 05:05 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests29 out of 29 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/20 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
10Packagingpackaging workflow detected
9Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 9
10SASTSAST tool detected
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Direkte Abhängigkeiten 35
RegistryPaketVersionsvorgabeManifest
NuGetMicrosoft.AspNetCore.OpenApisrc/IviCli.Api/IviCli.Api.csproj
NuGetMicrosoft.Extensions.DependencyInjection.Abstractionssrc/IviCli.Application/IviCli.Application.csproj
NuGetMicrosoft.Extensions.Logging.Abstractionssrc/IviCli.Application/IviCli.Application.csproj
NuGetTestableIO.System.IO.Abstractionssrc/IviCli.Application/IviCli.Application.csproj
NuGetMicrosoft.Extensions.DependencyInjection.Abstractionssrc/IviCli.Backends.Fake/IviCli.Backends.Fake.csproj
NuGetMicrosoft.Extensions.Logging.Abstractionssrc/IviCli.Backends.Fake/IviCli.Backends.Fake.csproj
NuGetMicrosoft.Extensions.DependencyInjection.Abstractionssrc/IviCli.Backends.HiSlip/IviCli.Backends.HiSlip.csproj
NuGetMicrosoft.Extensions.DependencyInjection.Abstractionssrc/IviCli.Backends.Local/IviCli.Backends.Local.csproj
NuGetMakaretu.Dnssrc/IviCli.Backends.Lxi/IviCli.Backends.Lxi.csproj
NuGetMakaretu.Dns.Multicastsrc/IviCli.Backends.Lxi/IviCli.Backends.Lxi.csproj
NuGetMicrosoft.Extensions.DependencyInjection.Abstractionssrc/IviCli.Backends.Lxi/IviCli.Backends.Lxi.csproj
NuGetMicrosoft.Extensions.Logging.Abstractionssrc/IviCli.Backends.Lxi/IviCli.Backends.Lxi.csproj
NuGetMicrosoft.Extensions.DependencyInjection.Abstractionssrc/IviCli.Backends.Replay/IviCli.Backends.Replay.csproj
NuGetMicrosoft.Extensions.DependencyInjection.Abstractionssrc/IviCli.Backends.Socket/IviCli.Backends.Socket.csproj
NuGetMicrosoft.Extensions.DependencyInjection.Abstractionssrc/IviCli.Backends.Vxi11/IviCli.Backends.Vxi11.csproj
NuGetMicrosoft.Extensions.Logging.Abstractionssrc/IviCli.Backends.Vxi11/IviCli.Backends.Vxi11.csproj
NuGetSystem.CommandLinesrc/IviCli.Cli/IviCli.Cli.csproj
NuGetMicrosoft.Extensions.Hostingsrc/IviCli.Cli/IviCli.Cli.csproj
NuGetMicrosoft.Extensions.Loggingsrc/IviCli.Cli/IviCli.Cli.csproj
NuGetSerilogsrc/IviCli.Cli/IviCli.Cli.csproj
NuGetSerilog.Extensions.Hostingsrc/IviCli.Cli/IviCli.Cli.csproj
NuGetSerilog.Sinks.Consolesrc/IviCli.Cli/IviCli.Cli.csproj
NuGetSerilog.Sinks.Filesrc/IviCli.Cli/IviCli.Cli.csproj
NuGetSerilog.Formatting.Compactsrc/IviCli.Cli/IviCli.Cli.csproj
NuGetSpectre.Consolesrc/IviCli.Cli/IviCli.Cli.csproj
NuGetOpenTelemetry.Extensions.Hostingsrc/IviCli.Cli/IviCli.Cli.csproj
NuGetOpenTelemetry.Exporter.OpenTelemetryProtocolsrc/IviCli.Cli/IviCli.Cli.csproj
NuGetOpenTelemetry.Instrumentation.AspNetCoresrc/IviCli.Cli/IviCli.Cli.csproj
NuGetMicrosoft.Extensions.DependencyInjection.Abstractionssrc/IviCli.Infrastructure/IviCli.Infrastructure.csproj
NuGetMicrosoft.Extensions.Logging.Abstractionssrc/IviCli.Infrastructure/IviCli.Infrastructure.csproj
NuGetTomlynsrc/IviCli.Infrastructure/IviCli.Infrastructure.csproj
NuGetTestableIO.System.IO.Abstractionssrc/IviCli.Infrastructure/IviCli.Infrastructure.csproj
NuGetTestableIO.System.IO.Abstractions.Wrapperssrc/IviCli.Infrastructure/IviCli.Infrastructure.csproj
NuGetMicrosoft.Extensions.DependencyInjection.Abstractionssrc/IviCli.Server/IviCli.Server.csproj
NuGetMicrosoft.Extensions.Logging.Abstractionssrc/IviCli.Server/IviCli.Server.csproj
Alle Abhängigkeiten nicht erhoben

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

JSON-Rohbericht maschinenlesbar
{
  "data": {
    "repo": {
      "topics": [
        "cli",
        "ivi",
        "visa"
      ],
      "is_fork": false,
      "size_kb": 1272,
      "has_wiki": false,
      "homepage": "https://www.nuget.org/packages/ivi-cli/",
      "languages": {
        "C#": 1728676,
        "Shell": 2146,
        "Dockerfile": 4666
      },
      "pushed_at": "2026-07-22T04:59:50Z",
      "created_at": "2026-05-19T02:04:54Z",
      "owner_type": "User",
      "updated_at": "2026-07-22T04:59:57Z",
      "description": "VISA/IVI based instrument integrated CLI",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "Apache-2.0",
      "default_branch": "main",
      "license_spdx_raw": "Apache-2.0",
      "primary_language": "C#",
      "significant_languages": [
        "C#"
      ]
    },
    "owner": {
      "blog": "https://shortarrow.jp",
      "name": null,
      "type": "User",
      "login": "ShortArrow",
      "company": "the Earth",
      "location": "Japan",
      "followers": 25,
      "avatar_url": "https://avatars.githubusercontent.com/u/16986253?v=4",
      "created_at": "2016-01-31T13:20:51Z",
      "is_verified": null,
      "public_repos": 161,
      "account_age_days": 3824
    },
    "license": {
      "state": "standard",
      "spdx_id": "Apache-2.0",
      "raw_spdx": "Apache-2.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.2.8",
          "kind": "patch",
          "published_at": "2026-07-22T04:59:44Z"
        },
        {
          "tag": "v0.2.7",
          "kind": "patch",
          "published_at": "2026-07-01T05:25:16Z"
        },
        {
          "tag": "v0.2.6",
          "kind": "patch",
          "published_at": "2026-06-29T07:29:24Z"
        },
        {
          "tag": "v0.2.5",
          "kind": "patch",
          "published_at": "2026-06-05T07:12:32Z"
        },
        {
          "tag": "v0.2.3",
          "kind": "patch",
          "published_at": "2026-06-04T03:10:40Z"
        },
        {
          "tag": "v0.2.2",
          "kind": "patch",
          "published_at": "2026-06-03T07:26:23Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-06-03T06:13:57Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-06-03T04:52:57Z"
        },
        {
          "tag": "v0.1.4",
          "kind": "patch",
          "published_at": "2026-06-03T02:09:46Z"
        },
        {
          "tag": "v0.1.3",
          "kind": "patch",
          "published_at": "2026-06-03T02:00:18Z"
        },
        {
          "tag": "v0.1.2",
          "kind": "patch",
          "published_at": "2026-06-03T00:10:56Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2026-06-02T22:44:01Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-06-02T07:06:20Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "3572403611b1bc225982d185336b106c24164f6c",
          "body": "…O.Abstractions.Wrappers (#83)\n\nBumps TestableIO.System.IO.Abstractions from 22.1.1 to 22.2.0\nBumps TestableIO.System.IO.Abstractions.Wrappers from 22.1.1 to 22.2.0\n\n---\nupdated-dependencies:\n- dependency-name: TestableIO.System.IO.Abstractions\n  dependency-version: 22.2.0\n  dependency-type: direct:\n[…]\nion-update:semver-minor\n  dependency-group: io-abstractions\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: Bump TestableIO.System.IO.Abstractions and TestableIO.System.I…",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-22T04:59:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3c981c8c5d66aec45e9bbbbf789dcf883a6edc6e",
          "body": "---\nupdated-dependencies:\n- dependency-name: NSubstitute\n  dependency-version: 6.0.0\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n  dependency-group: test-stack\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: Bump NSubstitute from 5.3.0 to 6.0.0 (#82)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-22T04:58:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7c81cfe6b778c10d1d6716c97cd38d95bcf977b4",
          "body": "Bumps [actions/setup-dotnet](https://github.com/actions/setup-dotnet) from 5.4.0 to 6.0.0.\n- [Release notes](https://github.com/actions/setup-dotnet/releases)\n- [Commits](https://github.com/actions/setup-dotnet/compare/26b0ec14cb23fa6904739307f278c14f94c95bf1...a98b56852c35b8e3190ac28c8c2271da59106c\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: Bump actions/setup-dotnet from 5.4.0 to 6.0.0 (#84)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-22T04:58:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "85919b842cc025e5850c099564e28df1e5b0537c",
          "body": "Bumps [docker/login-action](https://github.com/docker/login-action) from 4.2.0 to 4.4.0.\n- [Release notes](https://github.com/docker/login-action/releases)\n- [Commits](https://github.com/docker/login-action/compare/650006c6eb7dba73a995cc03b0b2d7f5ca915bee...af1e73f918a031802d376d3c8bbc3fe56130a9b0)\n\n[…]\nirect:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: Bump docker/login-action from 4.2.0 to 4.4.0 (#77)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-22T04:58:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "41d29a80b9a98b8f9d762a5be284bcbe1fc0a033",
          "body": "Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 7.2.0 to 7.3.0.\n- [Release notes](https://github.com/docker/build-push-action/releases)\n- [Commits](https://github.com/docker/build-push-action/compare/f9f3042f7e2789586610d6e8b85c8f03e5195baf...53b7df96c91f9c12dcc8a0\n[…]\nirect:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: Bump docker/build-push-action from 7.2.0 to 7.3.0 (#76)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-22T04:58:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ca930386fa0056f537b6ee9b1aafc24e5ae07a6a",
          "body": "Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 4.1.0 to 4.2.0.\n- [Release notes](https://github.com/docker/setup-qemu-action/releases)\n- [Commits](https://github.com/docker/setup-qemu-action/compare/06116385d9baf250c9f4dcb4858b16962ea869c3...96fe6ef7f33517b61c61be\n[…]\nirect:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: Bump docker/setup-qemu-action from 4.1.0 to 4.2.0 (#75)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-22T04:58:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b5f704daac2344f6b7058c4157a80e33436584b4",
          "body": "Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 4.1.0 to 4.2.0.\n- [Release notes](https://github.com/docker/setup-buildx-action/releases)\n- [Commits](https://github.com/docker/setup-buildx-action/compare/d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5...bb05f3f5519dd8\n[…]\nirect:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: Bump docker/setup-buildx-action from 4.1.0 to 4.2.0 (#74)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-22T04:58:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5154524e387953d9ccb7229824a3d8ce5c309c36",
          "body": "Version bump and CHANGELOG for 0.2.8: live mock-scenario re-binding across the\nSOCKET / HiSLIP / VXI-11 gateways and `ivicli mock received` (#85), the\n`diagnose` -> `doctor` rename with a deprecated alias (#81), and the\nMIT OR Apache-2.0 dual license (#72). Internal project lock files refreshed to\n0.2.8.",
          "is_bot": false,
          "headline": "chore(release): 0.2.8",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-07-22T04:42:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1db4702c82aaa7f4eca7ca5fa9ca62860c9eb75e",
          "body": "The published version is derived from the pushed `v*` tag, while\nDirectory.Build.props <Version> and docs/CHANGELOG.md are maintained by hand —\nso a tag can drift from either. Add two cheap guards:\n\n- release.yml gains a `guard` job (which `publish` now needs) that fails the\n  release if the tag doe\n[…]\nlished.\n- pr.yml gains a `version / CHANGELOG sync` check that fails a PR whose\n  <Version> has no matching CHANGELOG entry, catching a bump that forgot the\n  changelog (or vice versa) at review time.",
          "is_bot": false,
          "headline": "ci: guard version / tag / CHANGELOG consistency",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-07-22T04:41:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d7c8f377541d28d2c0a6bf2166659b6d16519143",
          "body": null,
          "is_bot": false,
          "headline": "add: work dirctory in gitignore",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-07-22T00:54:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "147c4be55a89c594db74844e0ca410151b3930a8",
          "body": "…d write verification\n\nLive re-binding: the SOCKET, HiSLIP, and VXI-11 gateways re-sync a device's\nscenario binding from the session before each SCPI dispatch, so a\nseparate-process `mock scenario activate` takes effect without restarting the\ngateway. Re-application is scoped to a changed scenario n\n[…]\nr> | --exact <scpi>]\n[--all] [--count] [--json]` reads the IVICLI_CAPTURE NDJSON out of band to\nconfirm which SCPI writes a device received, for tests that drive the mock\nthrough their own VISA stack.",
          "is_bot": false,
          "headline": "feat(mock): live scenario re-binding across gateways and mock receive…",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-07-21T23:40:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6a3058775ecf27a2b34c094dea0eae7e88706dc0",
          "body": "….0) (#81)\n\n* feat(cli)!: rename diagnose command to doctor\n\n* feat(cli): keep diagnose as deprecated alias of doctor\n\n* docs(prd): schedule diagnose alias removal at 0.3.0",
          "is_bot": false,
          "headline": "feat(cli): rename diagnose to doctor (keep deprecated alias until 0.3…",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-07-07T04:45:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dcf400f2b8770bfd0c494c4e3c5c9a07605bcc3e",
          "body": "* docs(readme): rework for user-facing clarity (connection diagram, use-first statefulness, clearer scenario/script terms)\n\n* docs(readme): link the official SCPI 1999.0 specification\n\n* docs(readme): split connection diagram into four per-scenario diagrams",
          "is_bot": false,
          "headline": "docs(readme): rework for user-facing clarity (#73)",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-07-06T07:56:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6d9be30c03c22ab582423fb99098ee5de9d6eab3",
          "body": null,
          "is_bot": false,
          "headline": "docs: add MIT OR Apache-2.0 dual license (ADR 0046) (#72)",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-07-03T08:22:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "120462b36a623621f1175ad295935567508810b8",
          "body": "Refresh the version and note LAN discovery now includes the opt-in\n--port socket sweep. EN + JP in lockstep.",
          "is_bot": false,
          "headline": "docs(readme): update status line from v0.1.0 to v0.2.7 (#71)",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-07-02T22:47:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4ff119545445c52a8ba8dc88748010bd9c8b8750",
          "body": "…cs/ (#70)\n\nKeep root README.md as the GitHub landing page; move the developer and\ntranslation docs into docs/ so the repo root stays uncluttered as more\nlanguages are added.\n\n- CONTRIBUTING.md / CONTRIBUTING.jp.md / CHANGELOG.md / README.jp.md -> docs/\n- Fix relative links inside the moved files (s\n[…]\n ../README.md).\n- Update the language switcher and Documentation links in README.md.\n- Update the i18n-sync check paths in pr.yml.\n- Update ADR 0024 (documentation policy) to record the new locations.",
          "is_bot": false,
          "headline": "chore(docs): relocate CONTRIBUTING, CHANGELOG, and README.jp under do…",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-07-01T08:05:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2ffa762aa545909828d19e677f6a452a4e0df1d8",
          "body": "Add a hadolint job to pr.yml, gated on a new docker output from the\nchanges job so it runs only when the Dockerfile, its build context, or\nthe hadolint config changes. hadolint-action is pinned to v3.3.0 by SHA.\n\n.hadolint.yaml sets failure-threshold to warning and ignores DL3008\n(apt version pinning is brittle on Debian slim; the image stays minimal\nvia --no-install-recommends and apt-list cleanup instead).",
          "is_bot": false,
          "headline": "ci: lint docker/Dockerfile with hadolint (#69)",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-07-01T07:32:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d37e7db999571a270f13b76ad0176cb647a2e247",
          "body": "A docs-only PR (README, guides, ADRs) ran the full 2-minute build /\nformat / analyzers / test job for no benefit, and git push did the\nsame locally via the pre-push hook.\n\n- pr.yml: a `changes` gate diffs the PR range; `build-and-test` now runs\n  only when a non-docs path changed. Title + i18n-sync \n[…]\n skipped job never blocks merge.\n- .husky/pre-push: skip `dotnet build` + `test` when the pushed range\n  touches only `*.md` / `docs/`; falls through to the full suite whenever\n  the range is unknown.",
          "is_bot": false,
          "headline": "ci: skip build + test on docs-only changes (#68)",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-07-01T07:20:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a0f953542bf3ff8923be89cb515744697595b642",
          "body": "* @\ndocs: add \"Mock a VISA instrument\" guide and reorder README\n\nThe README led with a full Docker mock-VISA e2e before the basic quick\nstart, and the only path to authoring a mock for your own instrument was\na single bottom-of-page \"Samples\" link — hard to find for an app\ndeveloper who wants to tes\n[…]\np them under\nfive headings — Stateful VISA-native CLI, Discover & inspect, Backends\n& gateways, Test without hardware, Control plane — as nested bullets.\nWording unchanged; EN + JP kept in lockstep.\n@",
          "is_bot": false,
          "headline": "docs: add \"Mock a VISA instrument\" guide and reorder README (#67)",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-07-01T06:23:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "154a1c744747aa9764ada20252b1530d7547d6a2",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.2.7 (#66)",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-07-01T05:18:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "851d9aa0dedf76ff23e4327d64292338daaa8d7b",
          "body": "* @\nfeat(scan): add --port TCP sweep and per-host protocol enrichment\n\n`visa scan` only surfaced the one protocol that answered broadcast/mDNS,\nso raw-SOCKET-only instruments (e.g. Keithley 2701 on vendor port 1394)\nwere invisible and a VXI-11-discovered device never listed its HiSLIP /\nSCPI-RAW acc\n[…]\nudit-as-error build repo-wide, not\njust on this branch. 2.7.5 is the first patched 2.x release (same major,\nAPI-compatible). Transitive-pinned via CPM; only the Api/Cli locks that\nresolve it change.\n@",
          "is_bot": false,
          "headline": "feat(scan): --port TCP sweep and per-host protocol enrichment (#65)",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-07-01T05:12:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bdd47ff38691c442a4d5eb1121fb6c86678af058",
          "body": "Instruments on non-standard ports were unreachable: HiSLIP was pinned\nto 4880 and VXI-11 to portmapper-or-1024, with no way to override.\n\nVisaResource.Tcpip gains an optional Port parsed from the VISA\n`lan_device,port` convention (e.g. TCPIP0::host::hislip0,5000::INSTR or\ninst0,20001::INSTR). HiSlip\n[…]\neps bare inst0 (the GETPORT-resolved\nCore port is dynamic; connect-time portmapper re-resolution is more\nrobust than baking it), and _vxi-11 mDNS keeps inst0 (its SRV is the\nportmapper, not the Core).",
          "is_bot": false,
          "headline": "feat(visa): allow explicit port via lan_device,port resource form (#64)",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-06-29T10:04:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "896d739e793c6fe8be3672e881bc8d2da30c568a",
          "body": "…Spectre.Console 0.57.1 (#63)\n\nConsolidates Dependabot PRs #56/#58/#59, which failed CI with NU1004\n(Dependabot updated Directory.Packages.props but not the lock files,\nso --locked-mode restore rejected the mismatch). Regenerates the lock\nfiles and verifies build + tests.\n\n- Microsoft.Extensions.Dep\n[…]\ncompletes the family with the .Abstractions already at 10.0.9)\n- OpenTelemetry.Instrumentation.AspNetCore 1.15.2 -> 1.16.0\n  (completes the OpenTelemetry 1.16.0 set)\n- Spectre.Console 0.56.0 -> 0.57.1",
          "is_bot": false,
          "headline": "chore(deps): bump Microsoft.Extensions 10.0.9, OpenTelemetry 1.16.0, …",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-06-29T07:41:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e9e4236174bfed6db87f1a7596fd0c6fa505c3c1",
          "body": "Bumps [actions/setup-dotnet](https://github.com/actions/setup-dotnet) from 5.3.0 to 5.4.0.\n- [Release notes](https://github.com/actions/setup-dotnet/releases)\n- [Commits](https://github.com/actions/setup-dotnet/compare/9a946fdbd5fb07b82b2f5a4466058b876ab72bb2...26b0ec14cb23fa6904739307f278c14f94c95b\n[…]\nirect:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: Bump actions/setup-dotnet from 5.3.0 to 5.4.0 (#53)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-29T07:34:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6f21d56d20270dfd32b3a040854d55711cfe777d",
          "body": "---\nupdated-dependencies:\n- dependency-name: nbgv\n  dependency-version: 3.10.85\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: Bump nbgv from 3.9.50 to 3.10.85 (#57)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-29T07:31:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3597f9d99bb353477ad2cdd86cf59fd0edf2f63a",
          "body": "Bumps Microsoft.NET.Test.Sdk from 18.6.0 to 18.7.0\n\n---\nupdated-dependencies:\n- dependency-name: Microsoft.NET.Test.Sdk\n  dependency-version: 18.7.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: test-stack\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: Bump the test-stack group with 1 update (#54)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-29T07:31:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "db9d087b9eff153ee68c328a76e7720ffee323d2",
          "body": "VXI-11 client portmapper round-trip (#20), multi-NIC `visa scan`,\nand resource display in `visa list`.",
          "is_bot": false,
          "headline": "chore(release): 0.2.6 (#62)",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-06-29T07:11:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5e44daf760e8c6cee022a43e92596bc3b8dab840",
          "body": "`visa list` previously printed only the alias and timeout, so the\nactual VISA resource (host / port / protocol) was invisible. It now\nshows the canonical resource string in both human (`name<TAB>resource<TAB>timeout`)\nand `--json` (new `resource` field) output.\n\nAdds VisaResource.ToCanonical() — the unmasked inverse of Parse(),\ndistinct from ToLogString() (ADR 0017 log masking). VisaScanCommand\n.FormatResource now delegates to it, removing the duplicated\nper-variant formatter.",
          "is_bot": false,
          "headline": "feat(cli): show resource string in visa list (human + json) (#61)",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-06-29T07:05:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f74ae6961796a9990ccc1fb85c876c4d42937f27",
          "body": "`visa scan` returned nothing on multi-homed hosts even when an\ninstrument sat on a directly-connected subnet: the scanner bound to\nIPAddress.Any and sent only to the limited broadcast 255.255.255.255,\nwhich egresses a single interface (the default route's) on Windows.\nAn instrument on a secondary la\n[…]\ncovery output; this\nmatches what `--add` already writes to config.\n\nmDNS multi-interface tuning is left as-is (Makaretu binds all\ninterfaces by default); the verified fix is the VXI-11 broadcast path.",
          "is_bot": false,
          "headline": "fix(scan): probe every NIC's subnet broadcast for VXI-11 discovery (#60)",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-06-29T06:58:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3563bbb442bdfb3ce9bd7b906025750ba1d9e111",
          "body": "* fix(vxi11): resolve Core port via TCP/111 portmapper GETPORT (#20)\n\nPhysical VXI-11 instruments (e.g. Kikusui PWR801L) publish their\nportmapper on TCP/111 and assign the Device Core to a dynamic port.\nThe client previously connected straight to a fixed port (1024) and\ntimed out against such instru\n[…]\nsync to a unicast UDP datagram\n(matching the broadcast scanner's transport) and parse the reply with\nthe shared TryParseGetportReply. Unicast UDP is routed normally, so\nthis also works across subnets.",
          "is_bot": false,
          "headline": "fix(vxi11): resolve Core port via TCP/111 portmapper GETPORT (#20) (#55)",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-06-29T06:46:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "42117498c52676dea77188c40c8f6007aa2235df",
          "body": "Consolidates Dependabot PRs #47/#48/#49/#50, which Dependabot self-closed as \"no longer updatable\" (a scheduling quirk, not a real resolution failure — CI was green on each).\n\n- Microsoft.AspNetCore.OpenApi 10.0.0 -> 10.0.9\n- Microsoft.AspNetCore.TestHost 10.0.0 -> 10.0.9\n- OpenTelemetry.Extensions.Hosting 1.15.3 -> 1.16.0\n- OpenTelemetry.Exporter.OpenTelemetryProtocol 1.15.3 -> 1.16.0",
          "is_bot": false,
          "headline": "chore(deps): bump AspNetCore 10.0.9 + OpenTelemetry 1.16.0 (#52)",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-06-26T10:25:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "68dae9ab3b1d17de53e87c02a8d5185e7568de3a",
          "body": "Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5.5.1 to 7.0.0.\n- [Release notes](https://github.com/codecov/codecov-action/releases)\n- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/codecov/codecov-action/c\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build(deps): bump codecov/codecov-action from 5.5.1 to 7.0.0 (#45)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-26T09:29:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "06c5e66dca1f6ddae9ef98bf15a158388e2b5b8d",
          "body": "Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.3 to 7.0.0.\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/checkout/compare/df4cb1c069e1874edd31b43\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build(deps): bump actions/checkout from 6.0.3 to 7.0.0 (#51)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-26T07:59:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8880e05d8b231c04ac714f19abe27cd4632a96f6",
          "body": "Bumps Microsoft.Extensions.DependencyInjection.Abstractions from 10.0.8 to 10.0.9\nBumps Microsoft.Extensions.Logging.Abstractions from 10.0.8 to 10.0.9\nBumps Microsoft.Extensions.TimeProvider.Testing from 10.6.0 to 10.7.0\n\n---\nupdated-dependencies:\n- dependency-name: Microsoft.Extensions.DependencyI\n[…]\npdate:semver-minor\n  dependency-group: microsoft-extensions\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: Bump the microsoft-extensions group with 3 updates (#46)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-26T07:59:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f1222a2bf4a54041d752f1c40b4758adbb182925",
          "body": "Recreates Dependabot PR #41 manually after Dependabot self-closed\nfollowing the docker-actions / csharpier merge cascade (\"Spectre.Console\nis no longer updatable\"). 0.56.0 is a non-breaking maintenance release\n(see release notes). Build + non-integration tests pass locally.",
          "is_bot": false,
          "headline": "chore(deps): bump Spectre.Console 0.55.2 -> 0.56.0 (#44)",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-06-09T08:28:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3e3f21c8c94020d68b9ef67cf0da88b2693c13be",
          "body": "Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 3.2.0 to 4.1.0.\n- [Release notes](https://github.com/docker/setup-qemu-action/releases)\n- [Commits](https://github.com/docker/setup-qemu-action/compare/49b3bc8e6bdd4a60e6116a5414239cba5943d3cf...06116385d9baf250c9f4dc\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build(deps): bump docker/setup-qemu-action from 3.2.0 to 4.1.0 (#39)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-09T08:18:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "313060e0314753878664c6b629fef0f68e4b14db",
          "body": "Bumps [docker/login-action](https://github.com/docker/login-action) from 3.3.0 to 4.2.0.\n- [Release notes](https://github.com/docker/login-action/releases)\n- [Commits](https://github.com/docker/login-action/compare/9780b0c442fbb1117ed29e0efdff1e18412f7567...650006c6eb7dba73a995cc03b0b2d7f5ca915bee)\n\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build(deps): bump docker/login-action from 3.3.0 to 4.2.0 (#38)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-09T08:18:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8bd23b1cec9c74bb8b1e3296c1fb9e552dabf724",
          "body": "Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6.9.0 to 7.2.0.\n- [Release notes](https://github.com/docker/build-push-action/releases)\n- [Commits](https://github.com/docker/build-push-action/compare/4f58ea79222b3b9dc2c8bbdd6debcef730109a75...f9f3042f7e2789586610d6\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build(deps): bump docker/build-push-action from 6.9.0 to 7.2.0 (#37)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-09T08:18:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2f01dccd38c4c7cb8fbcb4f105e8a3d9d119d872",
          "body": "Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 3.6.1 to 4.1.0.\n- [Release notes](https://github.com/docker/setup-buildx-action/releases)\n- [Commits](https://github.com/docker/setup-buildx-action/compare/988b5a0280414f521da01fcc63a27aeeb4b104db...d7f5e7f509e45c\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build(deps): bump docker/setup-buildx-action from 3.6.1 to 4.1.0 (#36)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-09T08:18:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2c9c1c73fe123e18546158cb565f616c51632f9a",
          "body": "---\nupdated-dependencies:\n- dependency-name: csharpier\n  dependency-version: 1.3.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: Bump csharpier from 1.2.6 to 1.3.0 (#40)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-09T08:18:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7cdaa06b01123f2fac4ea553789a343445138e08",
          "body": "The previously-pinned v5.1.2 SHA (1e68e06...75e3c0cd0a) is not a real\ncommit in codecov/codecov-action and fails action resolution on every\nPR with 'unable to find version'. Re-pin to the real v5.5.1 commit\nSHA so PR CI can run.",
          "is_bot": false,
          "headline": "ci(pr): fix unresolvable codecov-action SHA (v5.1.2 -> v5.5.1) (#43)",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-06-09T08:11:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4458e7797b0c5c47a3bcbe906a66401da17cd909",
          "body": "…to a device\n\nv0.2.4 made IVICLI_SCENARIO depend on session.CurrentDevice. The\npre-baked mock-VISA container ships with an empty session.json by\ndesign, so the v0.2.4 container build refused to arm the gateway\n('IVICLI_SCENARIO=default ignored: no current device selected')\nand the release-time smoke\n[…]\nkerfile now ships IVICLI_SCENARIO_FOR=mock1 alongside\nIVICLI_SCENARIO=default. Resolution order is IVICLI_SCENARIO_FOR\n→ session.CurrentDevice → skip-with-warning.\n\nBumps version to 0.2.5 + CHANGELOG.",
          "is_bot": false,
          "headline": "fix(cli,docker): IVICLI_SCENARIO_FOR env to bind env-loaded scenario …",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-06-05T07:01:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a41f39c6d172ae292c964d652465cc9b6113e694",
          "body": "…closes #36)\n\nv0.2.3's HiSLIP sub-address multiplexing put several backend devices\nbehind one gateway, but a single global active-scenario field meant\nactivating a state machine for one device forced the same machine on\nevery other device on that gateway. Multi-device mocks were only\nuseful when eve\n[…]\n 'visa use'), 'deactivate --for', and a\n  new 'list-active' subcommand. IVICLI_SCENARIO env binds to the\n  current device or warns when none is set.\n\nBumps version to 0.2.4 + CHANGELOG + ADR 0026 §16.",
          "is_bot": false,
          "headline": "feat(domain,application,backends,cli): per-device scenario bindings (…",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-06-05T02:26:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9bada36fdedfe295cfd2ca0bd52743a3dda9f38f",
          "body": "…29 #31 #32)\n\nApplies the minor-version dependabot PRs that build clean against\nthe current main, and explicitly defers the three major-version\nbumps that require source migration:\n\nApplied:\n- Serilog.Sinks.Console 6.0.0 → 6.1.1 (#28)\n- Spectre.Console 0.50.0 → 0.55.2 (#30)\n\nDeferred (require non-tr\n[…]\nm catches up.\n\nThese three will be tracked as separate issues for follow-up\nmigration work; the dependabot PRs are closed (not merged)\nbecause the rebased lock files alone don't make the source\nbuild.",
          "is_bot": false,
          "headline": "chore(deps): bump safe-minor NuGet packages (closes #28 #30, defers #…",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-06-04T03:17:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0c7d6b42650e6ea1e85aa4031eea88b6aed099c2",
          "body": "A single HiSLIP gateway server can now route distinct sub-addresses\n(hislip0 / hislip1 / ...) to distinct backend devices on the same\nTCP port. The gateway parses the ASCII payload of the client's\nInitialize message per IVI-6.1 §10.2.1 and looks up the matching\n`(server, endpoint)` route — replacing\n[…]\nhe\n  operator-facing contract.\n- CHANGELOG entry under v0.2.3 with the migration note (existing\n  PSU sample / idg deployment already uses `hislip0`, so no\n  action needed there).\n\nAll 625 tests pass.",
          "is_bot": false,
          "headline": "feat(server/hislip): sub-address multiplexing across routes (closes #21)",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-06-04T03:00:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1cdfad9afa7639a320003cb836c327ccc4e86d41",
          "body": null,
          "is_bot": false,
          "headline": "chore(deps): bump actions/checkout to v6.0.3 (closes #27)",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-06-04T00:58:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d0e2d4fa3f03d5258c5b6a99fa9b0af03fbcf598",
          "body": "…11 #13\n\nManual rebase + apply of the five outstanding NuGet PRs that were\nsitting against the pre-v0.1.0 main and could no longer be merged\nstraight. All five PRs' version bumps are folded into a single\ncommit so the lock files refresh in lockstep:\n\n- Microsoft.Extensions.Logging.Abstractions 10.0.\n[…]\nSdk 17.14.1 → 18.6.0\n- coverlet.collector 6.0.4 → 10.0.1\n- Verify.Xunit 28.5.0 → 31.12.5\n\nAll 25 packages.lock.json files regenerated via\n`dotnet restore --force-evaluate`. Suite stays at 623 passing.",
          "is_bot": false,
          "headline": "chore(deps): bump NuGet packages to subsume dependabot PRs #6 #7 #8 #…",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-06-04T00:54:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d3a356778a020154af1ad9d92b4b20979e751eaa",
          "body": "…3 #4 #5)\n\nSubsumes dependabot PRs #1-5 in a single Batch Z-equivalent push.\n\n- actions/checkout: v4.2.2 → v6.0.2\n- actions/download-artifact: v4.1.8 → v8.0.1\n- actions/upload-artifact: v4.4.3 → v7.0.1\n- actions/setup-dotnet: v4.1.0 → v5.3.0\n- amannn/action-semantic-pull-request: v5.5.3 → v6.1.1\n\nCl\n[…]\n the build job\ncould run — visible in #6 / #7 / #8 / #11 / #13.\n\nThe five original PRs will be closed once this lands; future\ndependabot regenerations will use the new prefix and pass the\ntitle check.",
          "is_bot": false,
          "headline": "chore(deps): bump GitHub Actions to latest SHA-pinned majors (#1 #2 #…",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-06-04T00:41:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a770a7d31eac1d31a6b3cff0f34402f1204fc333",
          "body": "Eliminates the v0.2.0 footgun where a freshly-created scenario was\nstuck in an empty synthetic `default` scene unless the user hand-\nedited TOML or used scene-add workarounds.\n\nApplication:\n\n- `CreateScenarioCommand` gains an optional `InitialScene` field.\n- `CreateScenarioCommandHandler` validates \n[…]\nandlerTests cover both polarities\n  (no flag → default scene, --initial → named scene as only\n  scene), the invalid-name failure path, and the\n  IdnDefault + InitialScene combo. Suite now 623 passing.",
          "is_bot": false,
          "headline": "feat(application,cli): mock scenario create --initial <scene> (v0.2.2)",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-06-03T07:16:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b669bdf56c6513616de016e44373a800e5787862",
          "body": "… clients reach gateway\n\nv0.1.3 introduced an unconditional scenario-aware short-circuit in\nDefaultBackendFactory — when any scenario was active, every\ndispatch collapsed to the FakeBackend, even on the client side.\nSide-effect: `ivicli visa query/write` against a HiSlip endpoint\n(...::hislip0::INST\n[…]\nt test in DefaultBackendFactoryTests now\ncovers all three polarities (VXI-11 → fallback; SOCKET → fallback;\nHiSlip → HiSlipBackend) when scenario is active.\n\nBumps to v0.2.1 (hotfix on top of v0.2.0).",
          "is_bot": false,
          "headline": "fix(infrastructure/backends): narrow scenario short-circuit so HiSlip…",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-06-03T06:06:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "870c9d8b652f55c2e585d225c4ed1afcb18facfe",
          "body": "…0.2-5)\n\nWraps up the v0.2.0 mock-domain refactor. Bumps to 0.2.0 and ships\nthe user-facing release docs.\n\nSample upgrade:\n\n- `docs/samples/psu/psu-bench.toml` is rewritten as a 2-state FSM\n  (`off` / `on`). `OUTP ON` walks off → on, `OUTP OFF` walks back.\n  `OUTP?` answers per state; `MEAS:VOLT?` /\n[…]\n\n  `rule.*` now mean different things).\n- Migration notes for CLI users, library consumers, and existing\n  scenario files.\n\nVersion bumped to 0.2.0 in Directory.Build.props.\n\nAll 619 tests stay green.",
          "is_bot": false,
          "headline": "docs(samples,changelog): PSU FSM sample + v0.2.0 release notes (#26 B…",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-06-03T04:45:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4a9e0e58f3259b9da82ffd745729e66b22c90205",
          "body": "…+ B0.2-4)\n\nLands the user-facing half of the v0.2.0 mock-domain refactor.\nAfter this batch, scenarios can be authored as state machines\nfrom the CLI and persisted in a TOML schema that survives a load-\nsave cycle.\n\nCLI (B0.2-4):\n\n- `mock scenario scene add <scenario> <scene>` — add an empty\n  state\n[…]\nws to the new state-node semantics.\n\nAll 619 tests pass. Audit op names + targets are new; tooling\nthat scrapes the NDJSON audit log will need to widen its\nrecognised set (documented in ADR 0026 §15).",
          "is_bot": false,
          "headline": "feat(cli,toml): scene/rule CLI + multi-scene TOML schema (#26 B0.2-2 …",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-06-03T04:39:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fe5b610208414088e6cf05ecc215cb158fea71ea",
          "body": "…g (#26 B0.2-3)\n\nLands the state-machine half of the v0.2.0 mock-domain refactor.\nA matched rule whose action carries a `Transition` field moves\nthe FakeBackend's current scene to the named target scene, so\nthe same SCPI command can produce different responses across a\nsingle session — modelling ins\n[…]\n.0 (issue #26 §\"Implementation plan\"):\nB0.2-2 multi-scene TOML schema + migrate tool, B0.2-4 CLI\nverbs (`scene add/remove`, `rule add/remove`, `--in`,\n`--transition-to`), B0.2-5 docs + sample upgrade.",
          "is_bot": false,
          "headline": "feat(domain/mock): RuleAction transitions + FakeBackend scene-trackin…",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-06-03T04:04:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "742f809b53132a1d6501d4fe673024c71b041ebc",
          "body": "…B0.2-1)\n\nBegins the v0.2.0 mock-domain refactor outlined in issue #26.\nThe v0.1.x model conflated 場面 (scene) and 1行のセリフ (rule)\ninto a single MockScene type; v0.2.0 reclaims \"scene\" for the\nstate-node role so the upcoming state-machine semantics\n(RuleAction.Transition in B0.2-3) read naturally.\n\nDom\n[…]\nionale + backwards-compatibility.\n\nAll 607 tests stay green. Observable CLI behaviour unchanged in\nthis batch — transitions land in B0.2-3, multi-scene TOML in\nB0.2-2, multi-scene CLI verbs in B0.2-4.",
          "is_bot": false,
          "headline": "refactor(domain/mock): Scenario/Scene/Rule hierarchy for v0.2.0 (#26 …",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-06-03T02:56:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9afc7fcbb2a8345337fcddcadda9d883bf70a613",
          "body": "Real-world reproducer: ImageDataGetter's PowerSupplyService\nemits the colon-prefixed form (`:OUTP ON`, `:MEAS:VOLT?`,\n`:VOLT 12.000`) per IEEE 488.2 §7.5 / SCPI 1999 §6.1.1 — the\ncolon is the \"absolute path from root\" prefix, and at message\nstart it is semantically equivalent to the bare form becaus\n[…]\nheory rows in FakeBackendScenarioTests cover the\nfour polarities (client `:foo` vs scene `foo`, client `foo` vs\nscene `:foo`, both prefixed, neither prefixed). Suite now 607\npassing.\n\nBumps to v0.1.4.",
          "is_bot": false,
          "headline": "fix(domain/mock): normalise SCPI leading-colon prefix in scene match",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-06-03T02:03:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "899094385195a252561abb68511bbfb2139f72f2",
          "body": "Closes #25. When `ivicli mock scenario activate <name>` has set\nthe FakeBackend's active scenario, `DefaultBackendFactory.CreateFor`\nnow short-circuits to the FakeBackend regardless of the device's\nVisaResource shape. Previously, a placeholder TCPIP-INSTR resource\nstill routed traffic to the VXI-11 \n[…]\nonfirm both polarities\n  (active scenario → fallback wins for inst0/hislip0/SOCKET;\n  inactive scenario → resource-shape dispatch still wires up\n  VXI-11 etc). Suite now 603 passing.\n\nBumps to v0.1.3.",
          "is_bot": false,
          "headline": "fix(infrastructure/backends): scenario-aware factory short-circuit (#25)",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-06-03T01:54:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "63fc0d4994b8eb73f28409bca7b12b95d036545e",
          "body": "NI MAX → Validate → Write `*IDN?\\n` → Read on the mock gateway\nreturned VI_ERROR_CONN_LOST (0xBFFF00A6). Two spec violations\nchained:\n\n1. IEEE 488.2 §7.5: real VISA clients terminate every SCPI line\n   with `\\r\\n` or `\\n`. The gateway forwarded the raw,\n   terminator-included string to ScpiQuery.Fro\n[…]\nas the MessageParameter of the response.\n- `HandleSyncChannelAsync` reads `header.MessageParameter` on\n  each Data / DataEnd and passes it through.\n\nAll 601 existing tests stay green. Bumps to v0.1.2.",
          "is_bot": false,
          "headline": "fix(server/hislip): trim SCPI terminator + echo client MessageId",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-06-03T00:04:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cc86ec61d0d0f0f7f636d9194f22f83e950b848f",
          "body": "Real-environment testing (NI MAX → Validate against ivi-cli mock\ngateway on idg) surfaced that an active mock scenario doesn't\nshort-circuit DefaultBackendFactory for traffic that arrives via\na gateway server. The factory sees the placeholder resource\nTCPIP0::127.0.0.1::INSTR, parses lanDevice=\"inst\n[…]\n process's environment,\nwhich collapses every transport backend to the FakeBackend\nfallback. Bake this into setup.sh / setup.ps1 and document it\nprominently in the sample README with a #25 cross-link.",
          "is_bot": false,
          "headline": "docs(samples/psu): force IVICLI_MOCK_ONLY=1 + cross-link #25",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-06-02T23:49:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f4077192aafba6594a62ef68c000c3b6f3d2a754",
          "body": "The HiSlipMessage framer treated the IVI-6.1 §10.1.1 prologue\nas a single byte (`'S'` = 0x53) and packed every subsequent\nfield one octet earlier than the spec demands. The result was\nthat ivi-cli's gateway spoke a non-HiSLIP protocol on the wire,\nwhich:\n\n- ivi-cli ↔ ivi-cli sessions happened to wor\n[…]\nfix, the\ndocs/samples/psu/ landing, the ci wave (bash defaults,\nNuGet OIDC, ghcr.io lowercase, per-RID archives, csproj\npack metadata), and the issues filed during the release-day\ndebugging (#14–#24).",
          "is_bot": false,
          "headline": "fix(domain/protocols): HiSLIP header prologue is 2-byte ASCII \"HS\"",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-06-02T22:37:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a734ebcc6cbb3eaaf17cc23f23882a9e4447cd66",
          "body": "Adds a PowerShell 7+ equivalent of setup.sh so Windows users\ndon't need WSL / Git Bash to spin up the PSU mock. The script\nuses pwsh-native parameter handling, an Invoke-IvicliStep\nhelper, and avoids the `|| true` idiom that PowerShell parses\nas a pipeline-chain operator (and then fails on the missi\n[…]\n for the mock\nto show up in their refresh button, since ivi-cli doesn't yet\nadvertise via mDNS / VXI-11 portmapper.\n\nPartially resolves #24. (Full resolution still wants README\nshell-detection prose.)",
          "is_bot": false,
          "headline": "docs(samples/psu): PowerShell-native setup.ps1 + NI MAX hint",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-06-02T22:26:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "edca4cc76980654ec5cd95f370a886c817fb1433",
          "body": "Two bugs from the initial sample caught during real-environment\ntesting on a Windows host:\n\n1. The mock-scene CLI lives under `mock scenario scene`, not\n   `mock scene` — `MockSceneCommand.Build` is attached as a\n   subcommand of `MockScenarioCommand` (see\n   src/IviCli.Cli/Commands/MockScenarioComm\n[…]\n was rejected with\n   \"invalid device name\". Switched to `psu_mock` (underscore\n   is allowed); ServerName (`hislip-psu`) and PublicEndpoint\n   (`hislip0`) DO allow hyphens, so those names stay as-is.",
          "is_bot": false,
          "headline": "docs(samples/psu): fix CLI invocation + device name in setup.sh",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-06-02T08:16:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "95a0e1410e6d8082410f462f766ecebf69d7d453",
          "body": "First entry under docs/samples/. Demonstrates the minimum\nivi-cli CLI commands to expose a programmable DC power-supply\nmock on HiSLIP (4880, sub-address `hislip0`) or raw SOCKET\n(5025), covering the typical SCPI surface:\n\n- *IDN? / *RST / *OPC?\n- OUTP {ON,OFF,?}\n- VOLT 5.0 / VOLT?\n- CURR 1.0 / CURR\n[…]\nvicli locally.\n- README.md — quick start + limitations + scenario directory\n  reference.\n\nLinked from README.md / README.jp.md Documentation section\n(lockstep, EN primary per the doc language policy).",
          "is_bot": false,
          "headline": "docs(samples): PSU mock VISA device sample (toml + setup script)",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-06-02T08:04:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7a8649bef643b671295e498c843e52b47d0f4381",
          "body": "The github-release job's \"Create GitHub Release\" step kept failing\nwith\n\n    Post ... assets?name=linux-arm64-selfcontained:\n    read ./artifacts/ivicli-linux-arm64/linux-arm64-selfcontained:\n    is a directory\n\nbecause the `./artifacts/**/*` glob expanded to include the\nself-contained / framework-d\n[…]\nelease page exposes one well-named download per platform/flavor\ninstead of a flat dump of dozens of .dll / .pdb files. The nupkg\nis attached as-is. The release-assets staging dir is the new glob\nroot.",
          "is_bot": false,
          "headline": "ci(release): bundle per-RID archives instead of raw publish dirs",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-06-02T06:58:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "41f25f08cd2f2bcb6684489f085733076a4f4804",
          "body": "The previous run's final job (`github release`) failed at\n\"Download all artifacts\" with\n\n    Unable to download and extract artifact: Artifact download\n    failed after 5 retries.\n\nCause: docker/build-push-action uploads a buildx provenance\nattestation as a side-effect artifact named\n`<owner>~<repo>\n[…]\n1 +\n:latest + :sha-dfb0311) are already published from the previous\nrun; this retry only needs to land the GitHub Release. The pack\nand docker jobs are idempotent (--skip-duplicate / image overwrite).",
          "is_bot": false,
          "headline": "ci(release): filter github-release download to ivicli-* artifacts only",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-06-02T06:44:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dfb0311708515a30e5d5ea21016dd4d34e0094d4",
          "body": "The PackageId change in IviCli.Cli.csproj (and the Version=0.1.0\ndefault in Directory.Build.props from Batch X) made every lock file\ninconsistent with the project graph, so `dotnet restore --locked-mode`\nfailed with NU1004:\n\n    A new project reference to ivi-cli was found for net10.0 target\n    fra\n[…]\n--force-evaluate` across all 25 lock\nfiles. No external package versions changed — only internal project\nreferences reflect the new identity (ivicli → ivi-cli) and the\ndefault version (1.0.0 → 0.1.0).",
          "is_bot": false,
          "headline": "build(deps): regenerate packages.lock.json for ivi-cli PackageId + 0.1.0",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-06-02T06:34:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "508065c92cf5ae81f0eb3dac29676e34ad78d4f9",
          "body": "src/Directory.Build.props sets IsPackable=false globally so library\nprojects don't accidentally publish to nuget.org. IviCli.Cli was\ninheriting this and dotnet pack silently produced no nupkg — the\nprevious release run failed downstream at `dotnet nuget push` with\n\n    error: Could not find a part o\n[…]\ny supplies the dynamic Version from\nthe git tag — the static metadata lives in the csproj where it\nbelongs.\n\nVerified locally: `dotnet pack ... -p:Version=0.1.0` produces\nivi-cli.0.1.0.nupkg (2.4 MB).",
          "is_bot": false,
          "headline": "build(cli): declare NuGet pack metadata in IviCli.Cli.csproj",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-06-02T06:04:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a06bd163be00c77b4e5b99bd7065673a7d8ec716",
          "body": "The previous run failed at the multi-arch push step with\n\n    ERROR: failed to build: invalid tag\n    \"ghcr.io/ShortArrow/ivi-cli-mock:v0.1.0\":\n    repository name must be lowercase\n\nGitHub's ${{ github.repository_owner }} preserves the original\ncasing (\"ShortArrow\"), but the OCI distribution spec —\n[…]\nags\" step and expose the full image reference as\nsteps.tags.outputs.image. All four tag lines now reference the\nsingle computed value.\n\nThe job-level env.IMAGE_NAME is no longer needed and is removed.",
          "is_bot": false,
          "headline": "ci(release): lowercase ghcr.io image name for OCI compliance",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-06-02T05:13:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "44e9bee74d8c86594de0d69c030ff98b479b1969",
          "body": "Replace the long-lived `NUGET_API_KEY` secret with NuGet.org's\nTrusted Publishing flow:\n\n- `pack` job gains `permissions: { id-token: write }` so the GitHub\n  Actions runner can request a short-lived OIDC token.\n- `NuGet/login@v1` exchanges that OIDC token for a 1-hour-valid\n  nuget.org API key via \n[…]\nremoved; explicit \"keyless\"\nnote added with cross-link to the upstream NuGet Trusted Publishing\ndocumentation. ghcr.io auth (already keyless via GITHUB_TOKEN) noted\nin the same paragraph for symmetry.",
          "is_bot": false,
          "headline": "ci(release): keyless NuGet publish via Trusted Publishing (OIDC)",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-06-02T03:53:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0f5cc1bc696c1d19f3de3c2b424f2309b15214c1",
          "body": "Windows GitHub-hosted runners default `run:` blocks to pwsh, which\nfails to parse the bash-style `\\` line continuations used by the\n`dotnet publish ...` (release.yml) and `dotnet test ...`\n(nightly.yml) multi-line commands.\n\nThe v0.1.0 publish attempt failed on both win-x64 and win-arm64\njobs at \"Pu\n[…]\nmplete unary operator. ubuntu / macos jobs pass since\nthey default to bash already.\n\nFix: workflow-level `defaults.run.shell: bash` on both workflows\nso every step parses identically regardless of OS.",
          "is_bot": false,
          "headline": "ci(release,nightly): default shell to bash for Windows runners",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-06-02T00:43:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7c20e8ed1e1717a47f661967ee5f51522d58527f",
          "body": "…al list (Batch Y)\n\nPRD §6.5 declared `ivicli driver` and `ivicli logical` namespaces\nbut they shipped as stubs. Without these the operator-debug\nworkflow (instrument talks but the IVI driver assembly is missing\nor mis-versioned) was missing its core inspection surface — gap\nPRD §14 MVP should not h\n[…]\nfied locally on Windows without IVI Shared Components\ninstalled: `ivicli driver list` prints\n\"(no IVI Configuration Store at C:\\ProgramData\\IVI Foundation\\\nIVI\\IviConfigurationStore.xml)\" and exits 0.",
          "is_bot": false,
          "headline": "feat(domain,application,infrastructure,cli,docs): driver list + logic…",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-05-29T10:34:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c7533019e27b3ce216d33d206ddc85e852dfbcc8",
          "body": "… CHANGELOG (Batch X)\n\nCloses the two consistency gaps that v0.1.0 should not ship with,\nand lands the release-engineering plumbing for the v0.1.0 tag.\n\nSOCKET resource shape (Task 1+2):\n- `VisaResource.TcpipSocket(Board, Host, Port)` is a new sibling\n  variant alongside the existing INSTR-form `Tcp\n[…]\ntions.\n- README + README.jp.md: status bullet promoted from \"alpha\" to\n  \"v0.1.0 — first public release\", linking the CHANGELOG.\n\nTotal tests: 593 passing (was 577; +15 SOCKET parser + 1\nhealthcheck).",
          "is_bot": false,
          "headline": "chore(release): v0.1.0 readiness — SOCKET shape + healthcheck quiet +…",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-05-29T10:08:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "83efe6ac9e0a973b18fa0606029ff6e7bb899e5f",
          "body": "… W Task 4)\n\nADR 0008 promoted from Draft TBD to Accepted with the full\ndiscovery strategy:\n\n- §1 Tiered sources: LXI mDNS (primary) + VXI-11 portmapper\n  broadcast (secondary) + nmap-style sweep (tertiary, deferred) +\n  NI-VISA viFindRsrc (OS-native via LocalBackend).\n- §2 LXI service types: _hisli\n[…]\niscovery,\n  different gravity centers); NI-VISA viFindRsrc;\n  PyVISA-py+zeroconf; Keysight/R&S equivalents.\n\nREADMEs (English + Japanese mirrors): new Highlights bullet for\nthe auto-discovery surface.",
          "is_bot": false,
          "headline": "docs(adr,readme): ADR 0008 discovery & multicast strategy fill (Batch…",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-05-29T08:46:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4fa718f18e5098e5c59bcb126dd6e1d3939f0a18",
          "body": "… visa scan --add (Batch W Tasks 1-3)\n\nImplements two real IBackendScanner sources so `ivicli visa scan`\nsurfaces VISA-capable instruments on the LAN without operator\nconfiguration (ADR 0008).\n\nNew project — src/IviCli.Backends.Lxi/\n- LxiMdnsScanner: Makaretu.Dns-based mDNS / DNS-SD client. Queries\n\n[…]\nno LXI devices returns\n  cleanly (no resources discovered).\n- `dotnet run -- visa scan --add` would auto-register every\n  discovered resource; tested with FakeBackendScanner seeded\n  resources via DI.",
          "is_bot": false,
          "headline": "feat(backends,cli): LXI mDNS + VXI-11 portmapper broadcast scanners +…",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-05-29T08:44:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "98c7a78cea22988c852bc3c85250320d70b22c24",
          "body": "…cker quick-start (Batch V Task 4)\n\nADR 0018 (Deployment Strategy) promoted from Draft TBD to Accepted\nwith the full deployment-channel inventory and the new mock-VISA\ncontainer channel as its centerpiece:\n\n- Channels table: self-contained binary (6 RIDs) / dotnet tool\n  nupkg / container image (NEW\n[…]\neck rule):\nnew \"Quick start with Docker (mock-VISA e2e)\" section landing\nbetween Install and the existing Quick start, showing the one-\nline docker run + ivicli SCPI roundtrip + the IDN baked default.",
          "is_bot": false,
          "headline": "docs(adr,readme): ADR 0018 deployment-strategy fill + cross-refs + Do…",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-05-29T07:48:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b3749df11f886357985a0e6d8d1c90d78216cd0d",
          "body": "…(Batch V Task 3)\n\nNew workflow `.github/workflows/pr-docker-smoke.yml` triggered only\non pull_request when the diff touches files that can break the\nmock-VISA container:\n\n  paths:\n    - docker/**\n    - .dockerignore\n    - src/IviCli.Cli/**\n    - .github/workflows/pr-docker-smoke.yml\n\n99 % of PRs ch\n[…]\nK. Failure dumps container logs\n   and fails the job.\n\nA separate workflow file (rather than a job in pr.yml) lets the\nstatus check appear only on relevant PRs, avoiding noise on every\nunrelated diff.",
          "is_bot": false,
          "headline": "ci(pr): paths-filtered docker smoke for container/CLI-entrypoint PRs …",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-05-29T07:44:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "094cf6a89d4f11b55cdc955cc2a95af8aaf97fe9",
          "body": "…ARCH (Batch V Task 2)\n\n- release.yml: new `docker` job between `publish` and `release`.\n  - Downloads ivicli-linux-x64 + ivicli-linux-arm64 artifacts.\n  - QEMU + Buildx for multi-arch.\n  - Logs in to ghcr.io via the workflow's built-in GITHUB_TOKEN\n    (release.yml already declares `permissions.pac\n[…]\nild -f docker/Dockerfile -t ivi-cli-mock:dev2 .` →\n  successful (TARGETARCH=amd64 → linux-x64-selfcontained).\n- Container healthy in 5 s, SCPI *IDN? round-trip returns\n  `IVICLI-MOCK,gateway,1,0.1.0`.",
          "is_bot": false,
          "headline": "ci(release,docker): docker-build-and-push job + multi-arch via TARGET…",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-05-29T07:43:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b19331ef6f556488eaed6c97da6fdddca41e2051",
          "body": "…atch V Task 1)\n\nShips the first container image for ivi-cli — purpose-built as a\nscenario-driven mock VISA instrument for 3rd-party app e2e testing\n(ADR 0018, Batch V plan):\n\n- docker/Dockerfile: multi-stage on mcr.microsoft.com/dotnet/\n  runtime-deps:9.0-bookworm-slim (Debian glibc; matches releas\n[…]\n`echo \"*IDN?\" | nc -w 2 127.0.0.1 5025` (inside container) →\n  `IVICLI-MOCK,gateway,1,0.1.0`\n- `echo \"*OPC?\" ...` → `1` ; `echo \"SYST:ERR?\" ...` → `0,\"No error\"`\n- docker stop → graceful exit in 1.6 s",
          "is_bot": false,
          "headline": "feat(docker,cli): mock-VISA container image + IVICLI_MOCK_ONLY env (B…",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-05-29T07:41:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9a04548677c4416010457bbc0eaf3cf980e8894b",
          "body": "ADR 0043 updated in place (living-doc rule):\n- Event-sum table notes Subject? on ConfigMutated / ServerLifecycle.\n- New §Subject paragraph covers IAuditSubject, CLI convention\n  cli/{user}, and the future api/{token.Label} extension point.\n- Operation/Target convention documented: {entity}.{verb} +\n\n[…]\nated into the audit timeline.\n- ADR 0036 extends the (now landed) audit-of-auth-events note\n  with the api/{token.Label} subject convention for any future\n  Management-API-driven config mutation path.",
          "is_bot": false,
          "headline": "docs(adr): ADR 0043 audit completion + cross-refs (Batch U Task 4)",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-05-29T02:24:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "078e110d45553ef0b22ec29aa60334c53188aa51",
          "body": "…Subject registration (Batch U Task 3)\n\nStartServerCommandHandler now emits a ServerLifecycle event for the\n'start' transition (after PID registry write, before RunAsync) and\na terminal event in the finally block — 'crashed' when RunAsync\nreturned Result.Error, 'stop' otherwise (success or cancellat\n[…]\nelled\n  termination paths and asserts the action sequence + subject.\n- NdjsonAuditLogTests gains two round-trip tests verifying Subject\n  reaches the NDJSON line for ConfigMutated and ServerLifecycle.",
          "is_bot": false,
          "headline": "feat(application,cli,infrastructure): ServerLifecycle wiring + IAudit…",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-05-29T02:20:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fd70e348d10c6a54e910506c6ab03c5126fa32db",
          "body": "…s (Batch U Task 2)\n\nADR 0043 follow-up: every command handler that persists\noperator-managed state now appends a ConfigMutated event with\nOperation = '{entity}.{verb}' and slash-joined Target. The\narchitecture-test guard caught RemoveScenarioCommandHandler that\nthe plan originally listed as 10 site\n[…]\niCli.Application for {Add,Remove,Create,Import}*CommandHandler\ntypes that depend on IConfigStore / IScenarioStore and verifies they\nall also depend on IAuditLog — drift guard against future omissions.",
          "is_bot": false,
          "headline": "feat(application): emit ConfigMutated from 11 config-mutating handler…",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-05-29T02:15:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b41a7d09902856654607c54152a107579effc295",
          "body": "… audit events (Batch U Task 1)\n\nSchema lift for ADR 0043 §7 follow-up: ConfigMutated and\nServerLifecycle gain an optional positional Subject field (default\nnull) so the wiring tasks can attribute mutations to a human\noperator without breaking existing 3-arg construction.\n\n- New IAuditSubject port (\n[…]\n\n  the upcoming handler-wiring tests share one fixture; nested\n  TestAuditLog removed from ScopeExpiryTests.\n\nNo emission sites yet — that lands in Task 2 (ConfigMutated) and\nTask 3 (ServerLifecycle).",
          "is_bot": false,
          "headline": "feat(application,cli): IAuditSubject + Subject field on Config/Server…",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-05-29T02:03:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "338ea84f43d5850fcd3427d00dee974c50e5dedb",
          "body": "ADR 0044 (new): records the design — ApiToken record gains Scopes\n+ ExpiresAt with backward-compat defaults; four v1 scopes\n(read:devices, read:servers, read:scenarios, write:scpi);\nRoutePermissions static table maps method+path to required scope;\nauth middleware emits two new audit reasons (expired\n[…]\ned.\n\nADR 0036 out-of-scope: token expiry / rotation and scopes lines\nreplaced with shipped cross-refs to ADR 0044.\n\nADR 0017 §6: Management API authentication row gains the ADR 0044\nshipped reference.",
          "is_bot": false,
          "headline": "docs(adr): ADR 0044 PAT scopes + expiry + cross-refs (Batch T Task 4)",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-05-28T09:40:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9ec369cd30181d8278cdd30fc5e82653a9222cfc",
          "body": "…h T Task 3)\n\n- CreateApiTokenCommand DTO gains Scopes + ExpiresAt; the handler\n  threads them onto the persisted ApiToken record. Default values\n  (empty Scopes, null ExpiresAt) preserve existing call sites.\n- ApiTokenCommand 'create' verb adds two new options:\n  * --scope read:devices (repeatable,\n[…]\nolumns / fields.\n  (unrestricted) renders for legacy tokens with empty Scopes.\n- 10 ParseExpiresAt theory tests pin the duration shortcuts, the\n  ISO-8601 parse, and the rejection of malformed inputs.",
          "is_bot": false,
          "headline": "feat(cli,application): --scope + --expires for api token create (Batc…",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-05-28T09:39:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5e7111a8f4fe63a1f4863041c47a86402a30ae2d",
          "body": "…k 2)\n\nApiTokenAuthentication middleware gains two checks after the\nexisting PAT hash match (ADR 0044):\n\n1. ApiToken.IsExpired(UtcNow) — when ExpiresAt is past, audit\n   AuthFailed(\"expired_token\") + 401 unauthorized.\n2. RoutePermissions.RequiredScope(method, path) → token.HasScope\n   gate — when th\n[…]\nn attempting POST query → 403 + insufficient_scope\n  * read:devices token can GET /v1/devices (200)\n  * legacy unrestricted token (empty Scopes) passes every gate\n\nCLI flags + ADR follow in Tasks 3-4.",
          "is_bot": false,
          "headline": "feat(api): auth middleware enforces token expiry + scope (Batch T Tas…",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-05-28T09:35:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9b1da4618ad2822c75e43614c9d8cfb575f9a38b",
          "body": "Tidy-First lift for ADR 0044 — domain shape and TOML round-trip\nfor PAT scopes and expiry, no auth-enforcement wiring yet.\n\n- ApiToken record gains optional Scopes (ImmutableArray<string>)\n  and ExpiresAt (DateTimeOffset?) positional parameters with\n  default values that keep every existing call sit\n[…]\nsts cover HasScope / IsExpired branches.\n- 2 Infrastructure tests cover the round-trip of the new fields\n  and legacy-token loading.\n\nAuth middleware enforcement + CLI flags + ADR follow in Tasks 2-4.",
          "is_bot": false,
          "headline": "feat(domain,infra): ApiToken scopes + ExpiresAt (Batch T Task 1)",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-05-28T09:31:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "736533313f3f1e0e65a3d38e910606812d698454",
          "body": "ADR 0013 reaches Accepted status, replacing the empty Draft. Records\nthe full design — the IviCli.Plugin contract assembly (IIviPlugin,\nIPluginServices, VisaResourceMatcher, HostApiVersion.Current=1),\n${IVICLI_DATA_DIR}/plugins/<name>/ discovery layout, plugin.toml\nmanifest schema, eight specific Pl\n[…]\n reload, native deps,\nper-plugin config injection).\n\nADR 0017 §6 gains a Plugin loading row pointing at ADR 0013 — opt-in\ntrust boundary that operators explicitly accept by flipping\n[plugins].enabled.",
          "is_bot": false,
          "headline": "docs(adr): ADR 0013 plugin system + ADR 0017 cross-ref (Batch S Task 4)",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-05-28T08:46:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ee2edae784303252a351894cdb8365eb56acb2e1",
          "body": "…ask 3)\n\nCloses the plugin-loader path end-to-end (ADR 0013) — plugins load\nfrom disk, IIviPlugin.Register stamps backends into the DI\ncontainer + a registration list, and the host's IBackendFactory\ndispatches matching devices to plugin backends.\n\n- src/IviCli.Infrastructure/Plugins/PluginBackendFac\n[…]\n,42,1.0\"),\n  non-matching devices fall through to the inner factory.\n- Adds Microsoft.Extensions.DependencyInjection (10.0.0) to CPM\n  for the e2e test's ServiceCollection.BuildServiceProvider() call.",
          "is_bot": false,
          "headline": "feat(infra,cli): plugin composition wiring + sample plugin (Batch S T…",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-05-28T08:44:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5591bc96fc949c15a4bd65320b111e334981b052",
          "body": "Discovers and loads plugin directories per ADR 0013. Each\nsubdirectory under the plugins root must contain plugin.toml +\nthe DLL named by manifest.assembly.\n\n- src/IviCli.Infrastructure/Plugins/PluginLoader.cs:\n  LoadAll() iterates subdirectories, calls LoadOne() for each,\n  collects successes and l\n[…]\ncover the manifest/permission\n  gates (disabled, missing dir, missing manifest, malformed TOML,\n  wrong API version, not-in-allowlist, missing DLL).\n\nComposition wiring + sample plugin land in Task 3.",
          "is_bot": false,
          "headline": "feat(infra): PluginLoader (Batch S Task 2)",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-05-28T08:34:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1d9b5093d48d731407a1acf70db458f5c3d0d692",
          "body": "…ask 1)\n\nTidy-First lift for ADR 0013 — plugin host contract surfaces and\nconfig schema; no loader or composition wiring yet.\n\n- src/IviCli.Plugin (new project): IIviPlugin (Name / Version /\n  TargetApiVersion / Register), IPluginServices (AddBackend with\n  VisaResourceMatcher), HostApiVersion.Curre\n[…]\n HostApiVersion.Current pin).\n- 5 PluginsConfig tests in Domain.Tests + 3 TomlConfigParser\n  round-trip / allowlist parsing tests.\n\nLoader, composition wiring, and the sample plugin land in Tasks 2-3.",
          "is_bot": false,
          "headline": "feat(plugin,domain,infra): plugin contract + config schema (Batch S T…",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-05-28T08:30:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6a359ebdfff5f42136a6270248e47d3f425a4a94",
          "body": "- ADR 0043 (new): records the design — IAuditLog port + five event\n  variants (AuthSucceeded, AuthFailed, ConfigMutated, ApiRequest,\n  ServerLifecycle), NDJSON sink with append + shared-read +\n  per-instance SemaphoreSlim, default-on with [audit] enabled =\n  false escape, privacy stance (token label\n[…]\neline\n  description to a shipped cross-ref to ADR 0043.\n- ADR 0036 out-of-scope §: Audit log line replaced with a shipped\n  cross-ref that lists the stable failure reason codes the\n  middleware emits.",
          "is_bot": false,
          "headline": "docs(adr): ADR 0043 audit log + cross-refs (Batch R Task 4)",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-05-28T08:20:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7c1575fe5b7d3a7c2018a500c053f18c38076bee",
          "body": "… R Task 3)\n\n- InfrastructureServiceCollectionExtensions.AddIviCliAuditLog\n  registers NdjsonAuditLog as the production IAuditLog at the\n  supplied path.\n- Program.cs uses the eagerly-loaded bootstrap config to install\n  either NdjsonAuditLog (when [audit] enabled) or NullAuditLog\n  (when disabled).\n[…]\nken\") + ApiRequest(401), and a valid\n  bearer emits AuthSucceeded(label) + ApiRequest(200).\n\nConfig mutation events + gateway lifecycle wiring are smaller\nfollow-ups; this commit establishes the path.",
          "is_bot": false,
          "headline": "feat(api,cli,infra): wire IAuditLog into auth + Management API (Batch…",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-05-28T08:18:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b93ce00752e33f76ce0d52710516766a0a4889eb",
          "body": "… Task 2)\n\n- NdjsonAuditLog (new, IviCli.Infrastructure.Audit): file-backed\n  IAuditLog appending one NDJSON line per event. Each variant is\n  serialised as a flat object with `kind` + `timestamp` + the\n  variant's properties so a `jq` filter can match on kind without\n  traversing an envelope. Appen\n[…]\n MockFileSystem cover one-line-per-event,\n  AuthFailed field flattening, parent-directory creation, and\n  concurrent-append integrity.\n\nWiring into auth / API / config / gateway sites lands in Task 3.",
          "is_bot": false,
          "headline": "feat(infra): NdjsonAuditLog + IviPaths.ResolveAuditDirectory (Batch R…",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-05-28T08:12:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5f5beab311112fdde0f56ac193fe7d238779d45b",
          "body": "… R Task 1)\n\nTidy-First lift for ADR 0043 — audit log infrastructure but no\nwiring or NDJSON writer yet.\n\n- IviCli.Application.Audit.AuditEvent (new): sealed sum with five\n  variants — AuthSucceeded, AuthFailed, ConfigMutated, ApiRequest,\n  ServerLifecycle. Each carries Timestamp + a canonical Kind \n[…]\nts whitespace-only paths.\n- ConfigDocument gains the Audit section + WithAudit() helper.\n- TomlConfigParser reads & serialises [audit] enabled + path.\n\nThe NdjsonAuditLog and wiring land in Tasks 2-3.",
          "is_bot": false,
          "headline": "feat(application,domain,infra): audit log port + config schema (Batch…",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-05-28T08:09:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e8c18881fcbc6a67704b7607b418c6cef8ab244a",
          "body": "…sk 4)\n\n- ADR 0042 (new): records the design — three new Core-channel RPCs\n  (device_create_intr_chan / device_destroy_intr_chan /\n  device_enable_srq) plus the outbound device_intr_srq on\n  program 395185 v1. Documents the reverse-TCP shape, the\n  per-connection ConnectionInterruptState + per-link \n[…]\nnts at ADR 0042.\n- ADR 0041 implementation matrix + out-of-scope §5: VXI-11\n  ServiceRequestStream row updated to point at ADR 0042; the\n  matching deferred bullet replaced with the shipped cross-ref.",
          "is_bot": false,
          "headline": "docs(adr): ADR 0042 VXI-11 Interrupt channel + cross-refs (Batch Q Ta…",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-05-28T07:55:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f7b0754ab1ad090f725cd2fa844a5b0e7d4da6c8",
          "body": "…k 3)\n\nVxi11Backend.OpenAsync now brings up the Interrupt channel (ADR\n0042) after create_link:\n- Vxi11Session.StartInterruptListener binds a loopback TCP listener\n  on a free port. Encodes the IPv4 → uint32 once and stores it\n  alongside the port + an opaque 4-byte handle.\n- Three new RPC helpers —\n[…]\nn +\n  enable_srq RPCs before expecting the procedure under test.\n\nRequired adding IviCli.Backends.Vxi11 as a ProjectReference of\nIviCli.Server.Tests so the new e2e can construct a Vxi11Backend\nclient.",
          "is_bot": false,
          "headline": "feat(vxi11): client Interrupt channel listener + e2e SRQ (Batch Q Tas…",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-05-28T07:53:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "62010ab257ce344be9e26cb8c358d74d5c98e765",
          "body": "…ask 2)\n\nVxi11GatewayServer gains three Core-channel handlers and the\noutbound SRQ delivery path per ADR 0042:\n\n- ProcCreateIntrChan: decodes Device_RemoteFunc and stores the\n  host/port on a new connection-scoped ConnectionInterruptState.\n  ProgFamily must be TCP (6) and the program must be 395185 \n[…]\nwarder.\n\nFailure-to-deliver an SRQ (rogue client port, etc.) logs at\nWarning and drops the event; the forwarder keeps running for\nsubsequent SRQs.\n\nClient-side TCP listener + e2e tests land in Task 3.",
          "is_bot": false,
          "headline": "feat(vxi11): server-side Interrupt channel + SRQ forwarder (Batch Q T…",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-05-28T07:46:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d73e15ec5f4db338e743c6c8482a7b5b0b8263fc",
          "body": "…Task 1)\n\nTidy-First lift for ADR 0042: pure XDR codec for the\nInterrupt-channel RPC payloads, no dispatch wiring yet.\n\n- Vxi11Constants gains InterruptProgram (395185), InterruptVersion,\n  ProcDeviceIntrSrq (30), ProcDeviceEnableSrq (18),\n  ProcCreateIntrChan (25), ProcDestroyIntrChan (26), and\n  P\n[…]\n gateway server and the client backend share one source of truth\n  (matches the boundary used by the existing Vxi11XdrCodec).\n\nServer-side dispatch + client-side TCP-reverse-connect land in\nTasks 2-3.",
          "is_bot": false,
          "headline": "feat(protocols): VXI-11 Interrupt channel codec + constants (Batch Q …",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-05-28T07:42:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ac48a910ee9e8f198ff21ef43f4b68a8c8911a26",
          "body": "…h P Task 4)\n\n- ADR 0041 (new): records the IIviBackend port extension —\n  TriggerAsync + ServiceRequestStream + new ServiceRequest value\n  type + BackendOperationNotSupported BackendError variant.\n  Documents the implementation matrix (Fake / Replay / Socket /\n  Local / HiSlip / Vxi11), the HiSLIP \n[…]\nSupported joins the BackendError\n  sum example.\n\nVXI-11 Interrupt channel (program 395185) explicitly stays\ndeferred — Vxi11Backend.ServiceRequestStream returns an empty\nstream until that batch lands.",
          "is_bot": false,
          "headline": "docs(adr): ADR 0041 Trigger + ServiceRequest ports + cross-refs (Batc…",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-05-28T06:27:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "27fdd50cc308cb18e5318c2ec314f61164fe227d",
          "body": "- Vxi11Constants gains ProcDeviceTrigger = 17.\n- Vxi11Backend.TriggerAsync issues the device_trigger RPC over the\n  Core channel with Device_GenericParms (lid, flags=0, io_timeout,\n  lock_timeout). Failure paths map to TransportDisconnected.\n- Vxi11GatewayServer dispatches ProcDeviceTrigger to a new\n[…]\n device_trigger → FakeBackend.TriggerCountFor == 1.\n\nInterrupt channel (program 395185) remains explicitly deferred to\nv2 per ADR 0029; Vxi11Backend.ServiceRequestStream still returns\nan empty stream.",
          "is_bot": false,
          "headline": "feat(vxi11): device_trigger (proc 17) on Core channel (Batch P Task 3)",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-05-28T06:25:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "74363bbe35349b7b06db4f6a262e87687ba4a24e",
          "body": "HiSlipBackend (client):\n- OpenAsync now opens the async channel in addition to the sync\n  channel and starts a background reader. Session id is captured\n  from InitializeResponse and replayed on AsyncInitialize so the\n  gateway can correlate the two TCP connections.\n- TriggerAsync sends HiSlipMessag\n[…]\nrSrqTests verify Trigger lands on the\nFakeBackend's TriggerCountFor and that RaiseServiceRequest on the\nFakeBackend propagates all the way out through the gateway to the\nHiSlipBackend client's stream.",
          "is_bot": false,
          "headline": "feat(hislip): Trigger + ServiceRequest end-to-end (Batch P Task 2)",
          "author_name": "ShortArrow",
          "author_login": "ShortArrow",
          "committed_at": "2026-05-28T06:22:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        }
      ],
      "releases_count": 13,
      "commits_last_year": 217,
      "latest_release_at": "2026-07-22T04:59:44Z",
      "latest_release_tag": "v0.2.8",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 7,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 5.5
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 57,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "ivi-cli",
          "exists": true,
          "license": null,
          "keywords": [
            "visa",
            "ivi",
            "scpi",
            "hislip",
            "vxi-11",
            "cli",
            "instrument",
            "test-automation"
          ],
          "ecosystem": "nuget",
          "matches_repo": true,
          "registry_url": "https://www.nuget.org/packages/ivi-cli",
          "is_deprecated": false,
          "latest_version": "0.2.8",
          "repository_url": "https://github.com/ShortArrow/ivi-cli",
          "versions_count": 14,
          "total_downloads": 40134,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-22T04:58:01.283000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 0,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_stars": 0
      },
      "open_issues_and_prs": 11
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "samples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "src/IviCli.Api/IviCli.Api.csproj",
        "src/IviCli.Application/IviCli.Application.csproj",
        "src/IviCli.Backends.Fake/IviCli.Backends.Fake.csproj",
        "src/IviCli.Backends.HiSlip/IviCli.Backends.HiSlip.csproj",
        "src/IviCli.Backends.Local/IviCli.Backends.Local.csproj",
        "src/IviCli.Backends.Lxi/IviCli.Backends.Lxi.csproj",
        "src/IviCli.Backends.Replay/IviCli.Backends.Replay.csproj",
        "src/IviCli.Backends.Socket/IviCli.Backends.Socket.csproj",
        "src/IviCli.Backends.Vxi11/IviCli.Backends.Vxi11.csproj",
        "src/IviCli.Cli/IviCli.Cli.csproj",
        "src/IviCli.Domain/IviCli.Domain.csproj",
        "src/IviCli.Infrastructure/IviCli.Infrastructure.csproj",
        "src/IviCli.Plugin/IviCli.Plugin.csproj",
        "src/IviCli.Server/IviCli.Server.csproj",
        "tests/IviCli.Api.Tests/IviCli.Api.Tests.csproj",
        "tests/IviCli.Application.Tests/IviCli.Application.Tests.csproj",
        "tests/IviCli.Backends.Fake.Tests/IviCli.Backends.Fake.Tests.csproj",
        "tests/IviCli.Backends.Local.Tests/IviCli.Backends.Local.Tests.csproj",
        "tests/IviCli.Backends.Replay.Tests/IviCli.Backends.Replay.Tests.csproj",
        "tests/IviCli.Backends.Socket.Tests/IviCli.Backends.Socket.Tests.csproj",
        "tests/IviCli.Backends.Vxi11.Tests/IviCli.Backends.Vxi11.Tests.csproj",
        "tests/IviCli.Cli.Tests/IviCli.Cli.Tests.csproj",
        "tests/IviCli.Domain.Tests/IviCli.Domain.Tests.csproj",
        "tests/IviCli.Infrastructure.Tests/IviCli.Infrastructure.Tests.csproj",
        "tests/IviCli.Plugin.Sample/IviCli.Plugin.Sample.csproj",
        "tests/IviCli.Plugin.Tests/IviCli.Plugin.Tests.csproj",
        "tests/IviCli.Server.Tests/IviCli.Server.Tests.csproj",
        "tests/IviCli.TestKit/IviCli.TestKit.csproj"
      ],
      "largest_source_bytes": 34602,
      "source_files_sampled": 385,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [],
      "dependencies": [
        {
          "name": "Microsoft.AspNetCore.OpenApi",
          "manifest": "src/IviCli.Api/IviCli.Api.csproj",
          "ecosystem": "nuget",
          "version_constraint": null
        },
        {
          "name": "Microsoft.Extensions.DependencyInjection.Abstractions",
          "manifest": "src/IviCli.Application/IviCli.Application.csproj",
          "ecosystem": "nuget",
          "version_constraint": null
        },
        {
          "name": "Microsoft.Extensions.Logging.Abstractions",
          "manifest": "src/IviCli.Application/IviCli.Application.csproj",
          "ecosystem": "nuget",
          "version_constraint": null
        },
        {
          "name": "TestableIO.System.IO.Abstractions",
          "manifest": "src/IviCli.Application/IviCli.Application.csproj",
          "ecosystem": "nuget",
          "version_constraint": null
        },
        {
          "name": "Microsoft.Extensions.DependencyInjection.Abstractions",
          "manifest": "src/IviCli.Backends.Fake/IviCli.Backends.Fake.csproj",
          "ecosystem": "nuget",
          "version_constraint": null
        },
        {
          "name": "Microsoft.Extensions.Logging.Abstractions",
          "manifest": "src/IviCli.Backends.Fake/IviCli.Backends.Fake.csproj",
          "ecosystem": "nuget",
          "version_constraint": null
        },
        {
          "name": "Microsoft.Extensions.DependencyInjection.Abstractions",
          "manifest": "src/IviCli.Backends.HiSlip/IviCli.Backends.HiSlip.csproj",
          "ecosystem": "nuget",
          "version_constraint": null
        },
        {
          "name": "Microsoft.Extensions.DependencyInjection.Abstractions",
          "manifest": "src/IviCli.Backends.Local/IviCli.Backends.Local.csproj",
          "ecosystem": "nuget",
          "version_constraint": null
        },
        {
          "name": "Makaretu.Dns",
          "manifest": "src/IviCli.Backends.Lxi/IviCli.Backends.Lxi.csproj",
          "ecosystem": "nuget",
          "version_constraint": null
        },
        {
          "name": "Makaretu.Dns.Multicast",
          "manifest": "src/IviCli.Backends.Lxi/IviCli.Backends.Lxi.csproj",
          "ecosystem": "nuget",
          "version_constraint": null
        },
        {
          "name": "Microsoft.Extensions.DependencyInjection.Abstractions",
          "manifest": "src/IviCli.Backends.Lxi/IviCli.Backends.Lxi.csproj",
          "ecosystem": "nuget",
          "version_constraint": null
        },
        {
          "name": "Microsoft.Extensions.Logging.Abstractions",
          "manifest": "src/IviCli.Backends.Lxi/IviCli.Backends.Lxi.csproj",
          "ecosystem": "nuget",
          "version_constraint": null
        },
        {
          "name": "Microsoft.Extensions.DependencyInjection.Abstractions",
          "manifest": "src/IviCli.Backends.Replay/IviCli.Backends.Replay.csproj",
          "ecosystem": "nuget",
          "version_constraint": null
        },
        {
          "name": "Microsoft.Extensions.DependencyInjection.Abstractions",
          "manifest": "src/IviCli.Backends.Socket/IviCli.Backends.Socket.csproj",
          "ecosystem": "nuget",
          "version_constraint": null
        },
        {
          "name": "Microsoft.Extensions.DependencyInjection.Abstractions",
          "manifest": "src/IviCli.Backends.Vxi11/IviCli.Backends.Vxi11.csproj",
          "ecosystem": "nuget",
          "version_constraint": null
        },
        {
          "name": "Microsoft.Extensions.Logging.Abstractions",
          "manifest": "src/IviCli.Backends.Vxi11/IviCli.Backends.Vxi11.csproj",
          "ecosystem": "nuget",
          "version_constraint": null
        },
        {
          "name": "System.CommandLine",
          "manifest": "src/IviCli.Cli/IviCli.Cli.csproj",
          "ecosystem": "nuget",
          "version_constraint": null
        },
        {
          "name": "Microsoft.Extensions.Hosting",
          "manifest": "src/IviCli.Cli/IviCli.Cli.csproj",
          "ecosystem": "nuget",
          "version_constraint": null
        },
        {
          "name": "Microsoft.Extensions.Logging",
          "manifest": "src/IviCli.Cli/IviCli.Cli.csproj",
          "ecosystem": "nuget",
          "version_constraint": null
        },
        {
          "name": "Serilog",
          "manifest": "src/IviCli.Cli/IviCli.Cli.csproj",
          "ecosystem": "nuget",
          "version_constraint": null
        },
        {
          "name": "Serilog.Extensions.Hosting",
          "manifest": "src/IviCli.Cli/IviCli.Cli.csproj",
          "ecosystem": "nuget",
          "version_constraint": null
        },
        {
          "name": "Serilog.Sinks.Console",
          "manifest": "src/IviCli.Cli/IviCli.Cli.csproj",
          "ecosystem": "nuget",
          "version_constraint": null
        },
        {
          "name": "Serilog.Sinks.File",
          "manifest": "src/IviCli.Cli/IviCli.Cli.csproj",
          "ecosystem": "nuget",
          "version_constraint": null
        },
        {
          "name": "Serilog.Formatting.Compact",
          "manifest": "src/IviCli.Cli/IviCli.Cli.csproj",
          "ecosystem": "nuget",
          "version_constraint": null
        },
        {
          "name": "Spectre.Console",
          "manifest": "src/IviCli.Cli/IviCli.Cli.csproj",
          "ecosystem": "nuget",
          "version_constraint": null
        },
        {
          "name": "OpenTelemetry.Extensions.Hosting",
          "manifest": "src/IviCli.Cli/IviCli.Cli.csproj",
          "ecosystem": "nuget",
          "version_constraint": null
        },
        {
          "name": "OpenTelemetry.Exporter.OpenTelemetryProtocol",
          "manifest": "src/IviCli.Cli/IviCli.Cli.csproj",
          "ecosystem": "nuget",
          "version_constraint": null
        },
        {
          "name": "OpenTelemetry.Instrumentation.AspNetCore",
          "manifest": "src/IviCli.Cli/IviCli.Cli.csproj",
          "ecosystem": "nuget",
          "version_constraint": null
        },
        {
          "name": "Microsoft.Extensions.DependencyInjection.Abstractions",
          "manifest": "src/IviCli.Infrastructure/IviCli.Infrastructure.csproj",
          "ecosystem": "nuget",
          "version_constraint": null
        },
        {
          "name": "Microsoft.Extensions.Logging.Abstractions",
          "manifest": "src/IviCli.Infrastructure/IviCli.Infrastructure.csproj",
          "ecosystem": "nuget",
          "version_constraint": null
        },
        {
          "name": "Tomlyn",
          "manifest": "src/IviCli.Infrastructure/IviCli.Infrastructure.csproj",
          "ecosystem": "nuget",
          "version_constraint": null
        },
        {
          "name": "TestableIO.System.IO.Abstractions",
          "manifest": "src/IviCli.Infrastructure/IviCli.Infrastructure.csproj",
          "ecosystem": "nuget",
          "version_constraint": null
        },
        {
          "name": "TestableIO.System.IO.Abstractions.Wrappers",
          "manifest": "src/IviCli.Infrastructure/IviCli.Infrastructure.csproj",
          "ecosystem": "nuget",
          "version_constraint": null
        },
        {
          "name": "Microsoft.Extensions.DependencyInjection.Abstractions",
          "manifest": "src/IviCli.Server/IviCli.Server.csproj",
          "ecosystem": "nuget",
          "version_constraint": null
        },
        {
          "name": "Microsoft.Extensions.Logging.Abstractions",
          "manifest": "src/IviCli.Server/IviCli.Server.csproj",
          "ecosystem": "nuget",
          "version_constraint": null
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 40,
        "open_issues": 11,
        "closed_ratio": 0.312,
        "closed_issues": 5,
        "closed_unmerged_prs": 31
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "ShortArrow",
          "commits": 209,
          "avatar_url": "https://avatars.githubusercontent.com/u/16986253?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "nightly.yml",
        "pr-docker-smoke.yml",
        "pr.yml",
        "release.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": true,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "packages.lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "29 out of 29 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/20 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": 10,
            "reason": "update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 9,
            "reason": "dependency not pinned by hash detected -- score normalized to 9",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 10,
            "reason": "SAST tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "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": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "3572403611b1bc225982d185336b106c24164f6c",
        "ran_at": "2026-07-22T05:05:34Z",
        "aggregate_score": 5,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": true
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-22T04:59:51Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-22T04:59:49Z",
      "ci_last_conclusion": null,
      "oldest_open_issues": [
        {
          "number": 14,
          "created_at": "2026-06-02T07:17:05Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 15,
          "created_at": "2026-06-02T07:17:18Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 16,
          "created_at": "2026-06-02T07:17:33Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 17,
          "created_at": "2026-06-02T07:17:47Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 18,
          "created_at": "2026-06-02T07:18:00Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 19,
          "created_at": "2026-06-02T07:18:13Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 22,
          "created_at": "2026-06-02T08:27:40Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 23,
          "created_at": "2026-06-02T08:27:42Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 33,
          "created_at": "2026-06-04T03:17:38Z",
          "last_comment_at": "2026-06-09T09:04:30Z",
          "last_comment_author": "ShortArrow"
        },
        {
          "number": 34,
          "created_at": "2026-06-04T03:17:41Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 35,
          "created_at": "2026-06-04T03:17:44Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/ShortArrow/ivi-cli",
    "host": "github.com",
    "name": "ivi-cli",
    "owner": "ShortArrow"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 58,
      "inputs": {
        "security": 50,
        "vitality": 71,
        "community": 40,
        "governance": 47,
        "engineering": 80
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 71,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 59,
            "inputs": {
              "commits_last_year": 217,
              "human_commit_share": 0.82,
              "days_since_last_push": 0,
              "active_weeks_last_year": 7
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "7/52 weeks with commits",
                "points": 4.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 7
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "217 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 217
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 13,
              "latest_release_tag": "v0.2.8",
              "releases_from_tags": false,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 5.5
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "13 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 13
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~5.5 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 5.5
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 40,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 0,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "0 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "good",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 70,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "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 (Apache-2.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "Apache-2.0"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 60,
            "inputs": {
              "packages": [
                "ivi-cli"
              ],
              "dependents": null,
              "ecosystems": "nuget",
              "total_downloads": 40134,
              "monthly_downloads": null
            },
            "components": [
              {
                "key": "total_downloads",
                "name": "Total downloads",
                "detail": "40,134 downloads all-time across nuget",
                "points": 47.8,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_total",
                    "params": {
                      "count": 40134,
                      "ecosystems": "nuget"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "at_risk",
        "name": "Sustainability & Governance",
        "value": 47,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 13,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "at_risk",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 36,
            "inputs": {
              "merged_prs": 40,
              "open_issues": 11,
              "closed_issues": 5,
              "issue_closed_ratio": 0.312,
              "closed_unmerged_prs": 31
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "31% of issues closed",
                "points": 14.6,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 31
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "40/71 decided PRs merged",
                "points": 21.5,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 40,
                      "decided": 71
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/20 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": 25,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "ShortArrow",
              "public_repos": 161,
              "account_age_days": 3824
            },
            "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": "25 followers of ShortArrow",
                "points": 10.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 25,
                      "login": "ShortArrow"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "161 public repos, account ~10 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 161
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 10
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "ivi-cli"
              ],
              "ecosystems": "nuget",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on nuget",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "nuget"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 0 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "14 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 14
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 80,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 74,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": true,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "4 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 6.4,
                "status": "met",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "29 out of 29 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": [
                "cli",
                "ivi",
                "visa"
              ],
              "has_wiki": false,
              "homepage": "https://www.nuget.org/packages/ivi-cli/",
              "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://www.nuget.org/packages/ivi-cli/",
                "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": "3 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 50,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "moderate",
            "name": "Security posture",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 18,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 0,
              "scorecard_aggregate": 5
            },
            "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": "29 out of 29 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/20 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": "update tool detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow 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 9",
                "points": 4.5,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool detected",
                "points": 5,
                "status": "met",
                "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": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "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": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "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": 2
            },
            "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": 62,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "82 of 82 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 82,
                      "sampled": 82
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 73,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "packages.lock.json"
              ],
              "has_dockerfile": true,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "toolchain_manifests": [
                "src/IviCli.Api/IviCli.Api.csproj",
                "src/IviCli.Application/IviCli.Application.csproj",
                "src/IviCli.Backends.Fake/IviCli.Backends.Fake.csproj",
                "src/IviCli.Backends.HiSlip/IviCli.Backends.HiSlip.csproj",
                "src/IviCli.Backends.Local/IviCli.Backends.Local.csproj",
                "src/IviCli.Backends.Lxi/IviCli.Backends.Lxi.csproj",
                "src/IviCli.Backends.Replay/IviCli.Backends.Replay.csproj",
                "src/IviCli.Backends.Socket/IviCli.Backends.Socket.csproj",
                "src/IviCli.Backends.Vxi11/IviCli.Backends.Vxi11.csproj",
                "src/IviCli.Cli/IviCli.Cli.csproj",
                "src/IviCli.Domain/IviCli.Domain.csproj",
                "src/IviCli.Infrastructure/IviCli.Infrastructure.csproj",
                "src/IviCli.Plugin/IviCli.Plugin.csproj",
                "src/IviCli.Server/IviCli.Server.csproj",
                "tests/IviCli.Api.Tests/IviCli.Api.Tests.csproj",
                "tests/IviCli.Application.Tests/IviCli.Application.Tests.csproj",
                "tests/IviCli.Backends.Fake.Tests/IviCli.Backends.Fake.Tests.csproj",
                "tests/IviCli.Backends.Local.Tests/IviCli.Backends.Local.Tests.csproj",
                "tests/IviCli.Backends.Replay.Tests/IviCli.Backends.Replay.Tests.csproj",
                "tests/IviCli.Backends.Socket.Tests/IviCli.Backends.Socket.Tests.csproj",
                "tests/IviCli.Backends.Vxi11.Tests/IviCli.Backends.Vxi11.Tests.csproj",
                "tests/IviCli.Cli.Tests/IviCli.Cli.Tests.csproj",
                "tests/IviCli.Domain.Tests/IviCli.Domain.Tests.csproj",
                "tests/IviCli.Infrastructure.Tests/IviCli.Infrastructure.Tests.csproj",
                "tests/IviCli.Plugin.Sample/IviCli.Plugin.Sample.csproj",
                "tests/IviCli.Plugin.Tests/IviCli.Plugin.Tests.csproj",
                "tests/IviCli.Server.Tests/IviCli.Server.Tests.csproj",
                "tests/IviCli.TestKit/IviCli.TestKit.csproj"
              ],
              "dependency_bot_commit_share": 0.18
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "src/IviCli.Api/IviCli.Api.csproj, src/IviCli.Application/IviCli.Application.csproj, src/IviCli.Backends.Fake/IviCli.Backends.Fake.csproj (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "src/IviCli.Api/IviCli.Api.csproj, src/IviCli.Application/IviCli.Application.csproj, src/IviCli.Backends.Fake/IviCli.Backends.Fake.csproj"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "C# (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "C#"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Dockerfile, lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile, lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "18 of the last 100 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 18,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 9",
                "points": 9,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "C#",
              "largest_source_bytes": 34602,
              "source_files_sampled": 385,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "C# (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "C#"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/385 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 385,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "samples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "samples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "samples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-22T05:05:50.424337Z",
  "schema_version": "0.26.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/s/ShortArrow/ivi-cli.svg",
  "full_name": "ShortArrow/ivi-cli",
  "license_state": "standard",
  "license_spdx": "Apache-2.0"
}

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