Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 1.13.0 · 2026-07-27 08:02 UTC

NLstn / odata-compliance-suite

Standalone black-box compliance test suite for OData v4.0 / v4.01 services

GoMIT★ 0 Sterne⑂ 0 Forksseit Juni 2026Auf GitHub ansehen ↗

NLstn/odata-compliance-suite erreicht einen Gesundheitsindex von 49 von 100 und liegt damit im Bereich Gefährdet. Am stärksten schneidet es bei Vitality (70/100) ab, am schwächsten bei Community & Adoption (24/100). Zuletzt vor 7 Tagen aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

49
gesamt / 100
Gefährdet

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.

49
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

NlstnPersönliches Konto
4 Follower10 öffentliche Reposseit Nov. 2014

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öffentlicht
Gogithub.com/nlstn/odata-compliance-suitev1.0.3-4vor 8 Tagen

Metriken nach Kategorie

Vitalität

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

70Gut · 22 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 7 Tagen
4.2/36Commit-Rhythmus — 6/52 Wochen mit Commits
16.9/18Commit-Volumen — 75 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_year75
human_commit_share0,933
days_since_last_push7
active_weeks_last_year6
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 5 Releases veröffentlicht
36/36Release-Aktualität — letztes Release vor 8 Tagen
27/27Release-Rhythmus — ein Release etwa alle 8,7 Tage
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Verwendete Eingangsdaten
releases_count5
latest_release_tagv1.0.3
releases_from_tagsnein
days_since_latest_release8
mean_days_between_releases8,7

Community & Verbreitung

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

24Kritisch · 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 (MIT)
0/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
0/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
has_contributingnein
has_issue_templatenein
has_code_of_conductnein
has_pull_request_templatenein

Nachhaltigkeit & Governance

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

44Gefä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
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Verwendete Eingangsdaten
bus_factor1
contributors_sampled1
top_contributor_share1
Wie die Bewertung erfolgt
10.8/46.8Issue-Lösungsquote — 23 % der Issues geschlossen
35.1/38.3PR-Annahme — 56/61 entschiedene PRs gemergt
0/15OpenSSF Scorecard: Code-Review — Found 0/25 approved changesets -- score normalized to 0
Verwendete Eingangsdaten
merged_prs56
open_issues10
closed_issues3
issue_closed_ratio0,231
closed_unmerged_prs5
Wie die Bewertung erfolgt
10/30Organisatorische Trägerschaft — persönliches (Nutzer-)Konto
0/20Verifizierte Domain — für Nutzerkonten nicht anwendbar
5/25Reichweite des Inhabers — 4 Follower von NLstn
19.6/25Kontohistorie — 10 öffentliche Repos, Kontoalter ca. 11 Jahre
Verwendete Eingangsdaten
followers4
owner_typeUser
is_verified
owner_loginNLstn
public_repos10
account_age_days4.284
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Verifizierte Domain. Die verbleibenden Gewichte wurden renormalisiert.

Paketpflege

92Exzellent
Wie die Bewertung erfolgt
25/25Veröffentlicht & auflösbar — 1 Paket(e) auf go
35/35Veröffentlichungsaktualität — letzte Veröffentlichung vor 8 Tagen
12/20Versionshistorie — 4 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packagesgithub.com/nlstn/odata-compliance-suite
ecosystemsgo
any_deprecatednein
min_days_since_publish8

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

61Mittel · 20 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 3 Workflow(s)
24/24Tests vorhanden
0/16Linter-Konfiguration
0/9.6Pre-Commit-Hooks
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 25 out of 25 merged PRs checked by a CI test -- score normalized to 10
Verwendete Eingangsdaten
has_cija
has_testsja
has_editorconfignein
has_linter_confignein
has_precommit_confignein
Wie die Bewertung erfolgt
30/30README
0/25Dokumentationsverzeichnis
0/15Dokumentations-/Homepage-Site
10/10Repository-Beschreibung
0/10Topics
10/10Wiki
Verwendete Eingangsdaten
topics
has_wikija
homepage
has_readmeja
has_docs_dirnein
has_descriptionja

Sicherheit

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

43Gefährdet · 16 % des Gesamtindex

Sicherheitslage

43Gefährdet
Wie die Bewertung erfolgt
7.5/7.5Binary-Artifacts — no binaries found in the repo
2.2/7.5Branch-Protection — branch protection is not maximal on development and all release branches
2.5/2.5CI-Tests — 25 out of 25 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/25 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
10/10Dangerous-Workflow — no dangerous workflow patterns detected
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
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — 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_aggregate4,3

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.

67Mittel · 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 — 56 von 70 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share0,8
agent_instruction_files
agent_instruction_max_bytes
Wie die Bewertung erfolgt
12.6/18Bootstrap mit einem Befehl — go.mod (Toolchain-Konvention, kein Task-Runner)
22/22Automatisierte Tests
0/11Lint-/Format-Konfiguration
11/11Statische Typprüfung — Go (statisch typisiert)
10/10Reproduzierbare Umgebung — Dockerfile
10/10Belegte Agentenpraxis — 64 der letzten 75 Commits von Agenten verfasst oder ihnen zugeschrieben
8/8Automatisierte Wartung — 5 der letzten 75 Commits sind automatisierte Abhängigkeits-Updates
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfiles
has_dockerfileja
typed_languageja
bootstrap_files
has_devcontainernein
has_linter_confignein
typecheck_configs
agent_commit_share0,853
toolchain_manifestsgo.mod
dependency_bot_commit_share0,067
Wie die Bewertung erfolgt
45/45Typprüfbarer Code — Go (statisch typisiert)
54.7/55Handhabbare Dateigrößen — 1/181 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languageGo
largest_source_bytes66.611
source_files_sampled181
oversized_source_files1

Eckdaten

0GitHub-Sterne
1Mitwirkende
75Commits, letzte 12 Monate
7Tage seit letztem Push
5Releases
1Bus-Faktor
10offene Issues
GoPaket-Ökosysteme

Weitere Details

OpenSSF Scorecard 4.3 / 10
4.3Gesamtwert

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-27 08:02 UTC

10Binary-Artifactsno binaries found in the repo
3Branch-Protectionbranch protection is not maximal on development and all release branches
10CI-Tests25 out of 25 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/25 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
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
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Alle Abhängigkeiten 0

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

RegistryPaketVersionBeziehung
Abhängigkeits-Advisories nicht bewertet

Der Advisory-Abgleich konnte für diesen Bericht nicht ausgeführt werden: No resolved dependencies to assess

JSON-Rohbericht maschinenlesbar
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 602,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Go": 1405868,
        "Shell": 2630,
        "Dockerfile": 1182
      },
      "pushed_at": "2026-07-19T11:02:48Z",
      "created_at": "2026-06-14T14:08:56Z",
      "owner_type": "User",
      "updated_at": "2026-07-18T14:04:55Z",
      "description": "Standalone black-box compliance test suite for OData v4.0 / v4.01 services",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Nlstn",
      "type": "User",
      "login": "NLstn",
      "company": null,
      "location": null,
      "followers": 4,
      "avatar_url": "https://avatars.githubusercontent.com/u/9517868?v=4",
      "created_at": "2014-11-02T19:32:48Z",
      "is_verified": null,
      "public_repos": 10,
      "account_age_days": 4284
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v1.0.3",
          "kind": "patch",
          "published_at": "2026-07-19T07:41:07Z"
        },
        {
          "tag": "v1",
          "kind": "other",
          "published_at": "2026-07-11T08:24:36Z"
        },
        {
          "tag": "v1.0.2",
          "kind": "patch",
          "published_at": "2026-06-27T20:23:20Z"
        },
        {
          "tag": "v1.0.1",
          "kind": "patch",
          "published_at": "2026-06-27T20:04:15Z"
        },
        {
          "tag": "v1.0.0",
          "kind": "major",
          "published_at": "2026-06-14T15:27:22Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "eee4d3024decfa230533adb61292d9f473ddde77",
          "body": "12.1_operations.go and 11.4.13_action_function_parameters.go checked\nonly HTTP status and response shape for functions/actions, never the\nactual computed result or side effect against the seeded fixture\ndata — trivially checkable given the suite already knows the exact\nseed values.\n\n- test_unbound_f\n[…]\nwriting assertions. Full build/vet/test clean; full-suite run shows no\nregressions (test count rose by exactly the 4 new negative tests\nadded).\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Verify operation results against an oracle; add negative-path tests",
          "author_name": "Niklas Lahnstein",
          "author_login": "NLstn",
          "committed_at": "2026-07-18T14:04:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9d728252b3053b69a1ebfd87ba8dda813bfc9a9f",
          "body": "Several tests in this area had every code path return nil regardless\nof server behavior, or only checked for textual co-occurrence in\n$metadata rather than actual declared values or runtime behavior.\n\n- 4.1_nominal_types.go: test_collection_types_use_qualified_names now\n  actually checks every Colle\n[…]\nthat hasn't landed.\n\nVerified all four files against a live go-odata reference server; full\nsuite run across all versions shows no regressions.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Replace tautological type-system metadata checks with real assertions",
          "author_name": "Niklas Lahnstein",
          "author_login": "NLstn",
          "committed_at": "2026-07-18T13:57:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a0d6fb616069c6da41f99987c757a427a41c7ad7",
          "body": "8.2.2_header_if_match.go covered If-Match: * (existing-entity\nconcurrency) but had no test for the complementary\nIf-None-Match: * \"create-if-not-exists\" guard: per RFC 7232 §3.2, a\nnon-GET/HEAD request with If-None-Match: * targeting a resource that\nalready exists MUST fail with 412.\n\nVerified again\n[…]\ne, and didn't want to assert an\nunverified requirement as a hard test failure.\n\nFull build/vet/test clean; full suite run shows no regressions.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add If-None-Match: * create-if-not-exists test",
          "author_name": "Niklas Lahnstein",
          "author_login": "NLstn",
          "committed_at": "2026-07-18T13:47:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9f1a6c7467d5abb65c6ee9e73699cebac462b641",
          "body": "…emantics\n\ntest_patch_to_null checked only the PATCH request's own status code,\nnever that the property actually became null. PATCH-omit-is-a-no-op\nand PUT's \"omitted nullable properties reset to null\" (the actual\nsubject of §11.4.14) had zero coverage.\n\n- test_patch_to_null now re-GETs and confirms\n[…]\no-odata reference server\nbefore writing the assertions. Full build/vet/test and full-suite run\nacross all versions: 0 failures, no regressions.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Strengthen null-value handling: verify persistence and PATCH-vs-PUT s…",
          "author_name": "Niklas Lahnstein",
          "author_login": "NLstn",
          "committed_at": "2026-07-18T13:43:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d720c1706692c21231bbcb476962e453a4b45b31",
          "body": "Both header_isolation.go files (v4_0 and v4_01) accepted 200 or 412\nunconditionally for OData-Isolation/Isolation: snapshot, with zero\nbehavioral verification — a server that fully ignores the header is\nindistinguishable from one implementing snapshot isolation correctly.\n\nWhen the header is accepte\n[…]\n as a hard requirement.\n\nVerified against a live go-odata reference server: both files pass;\nfull run across all versions shows no regressions.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Exercise real pagination behavior in the isolation-header tests",
          "author_name": "Niklas Lahnstein",
          "author_login": "NLstn",
          "committed_at": "2026-07-18T13:39:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "706a322d988f0421019a75c3e0ce082858d60f30",
          "body": "test_odata_entityid_header silently passed on any status outside\n200/201 (return nil), and even then only checked the header if it\nhappened to be present. Both tests used loose substring matching\ninstead of confirming the header actually identifies the created\nentity.\n\nNow requires 201 explicitly fo\n[…]\nresponse body\nis empty (the only way to identify the entity in that case).\n\nVerified against a live go-odata reference server: both tests pass.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Dereference OData-EntityId instead of a vacuous status/substring check",
          "author_name": "Niklas Lahnstein",
          "author_login": "NLstn",
          "committed_at": "2026-07-18T13:32:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "abdec8c157500faf2fa6d0f2d35b95758f24429b",
          "body": "11.4.2_create_entity.go and 11.4.3_update_entity.go had zero negative-\npayload tests and no conflicting-key coverage, despite these being\nexplicit spec-relevant scenarios.\n\n- test_post_missing_required_field / test_post_wrong_type_rejected:\n  POST with a missing required property or a wrong-typed on\n[…]\ng ID never spawns a second\n  entity under PUT.\n\nVerified individually against a live go-odata reference server; full\nbuild/vet/test also clean.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add negative-payload and conflicting-key tests for create/update",
          "author_name": "Niklas Lahnstein",
          "author_login": "NLstn",
          "committed_at": "2026-07-18T13:29:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f13c93160de81faffe3236ed63be4054e8029648",
          "body": "test_400_error_format returned nil (pass) whenever the server did not\nrespond with 400 to a syntactically invalid $filter — the single most\nimpactful vacuous check found in the CRUD/headers audit. A regression\nthat stopped rejecting malformed filter syntax entirely would pass\nthis test undetected. N\n[…]\nng 404 test's rigor.\n\nVerified against a live go-odata reference server: still passes (the\nserver correctly rejects \"invalid syntax\" with 400).\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fail loudly when malformed $filter syntax is silently accepted",
          "author_name": "Niklas Lahnstein",
          "author_login": "NLstn",
          "committed_at": "2026-07-18T13:25:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fd744a23e82dc1865543be995064411ae4dde3ea",
          "body": "NLstn/go-odata#814 and #815 are both closed upstream. Removed the\nskip-on-known-bug fallbacks added when these tests were written and\nreplaced them with strict assertions of the now-correct behavior:\n\n- 5.1.1.5_numeric_boundary_tests.go: test_arithmetic_precision_loss\n  no longer skips on a missing \n[…]\n skips for these two cases. Full run across all\nversions: 1198 tests, 0 failures, skips dropped from 30 to 28 (exactly\nthe two resolved cases).\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Harden two tests now that their tracked go-odata bugs are fixed",
          "author_name": "Niklas Lahnstein",
          "author_login": "NLstn",
          "committed_at": "2026-07-18T13:16:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "333995136a49f1fb82b939be664f8c9dcd9d2431",
          "body": "capabilityRequirements and conformanceTags are keyed by suite name in\nmaps separate from each suite's own constructor. A typo'd or stale key\nwas a silent no-op (map miss): a suite that should have been\ncapability-gated would instead run unconditionally against a service\nthat declares the feature uns\n[…]\nfirmed the program exits with a\nclear error naming it, then restored the file and reran clean — 0\nregressions, same pass/skip counts as before.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fail loudly on capabilityRequirements/conformanceTags typos",
          "author_name": "Niklas Lahnstein",
          "author_login": "NLstn",
          "committed_at": "2026-07-18T09:40:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6003fd27f5bbe7ea76fa2b2168fdc73130684bba",
          "body": "divby's whole reason for existing alongside div is to guarantee a\nwell-defined floating-point result rather than an error — and\ndivision by zero is the canonical edge case for that guarantee, but\nnone of the suite's 4 divby tests exercised it.\n\nVerified against the live reference server that Price d\n[…]\nset of either.\n\nVerified individually and via a full run across all versions (1198\ntests) against a live go-odata reference server: 0 failures.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add a divby division-by-zero test",
          "author_name": "Niklas Lahnstein",
          "author_login": "NLstn",
          "committed_at": "2026-07-18T09:34:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6e971ba54726d3cca28a5f0c4ed420be980ea322",
          "body": "11.4.9.3_batch_content_id_referencing.go already thoroughly covered\nContent-ID cross-referencing (read-back, PATCH, DELETE, multiple IDs,\nnavigation-property use, response echo, unresolvable-reference\nrollback) — the original audit finding claiming no cross-reference\ntest existed anywhere was based \n[…]\nlled-back r1).\n\nVerified individually and via a full run across all versions (1197\ntests) against a live go-odata reference server: 0 failures.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add Content-ID uniqueness coverage and a stronger rollback check",
          "author_name": "Niklas Lahnstein",
          "author_login": "NLstn",
          "committed_at": "2026-07-18T09:29:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8d20eb9417568a01808e41d1a82b2ac48a161db6",
          "body": "Boundary tests filter-read pre-seeded in-range values but never wrote\nthe exact type boundary to confirm round-trip, never wrote boundary+1\nto confirm rejection, and several had no assertion path at all\n(ctx.Log-then-return-nil, unconditionally passing regardless of server\nbehavior).\n\n- 5.1.1.2_byte\n[…]\nd upstream fix.\n\nVerified individually and via a full v4.0 run (130 suites / 1010+\ntests) against a live go-odata reference server: 0 failures.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Round-trip numeric boundary values instead of only filter-reading them",
          "author_name": "Niklas Lahnstein",
          "author_login": "NLstn",
          "committed_at": "2026-07-18T09:24:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8c47db66f432c38d5da594603315fb56bb954db2",
          "body": "Several CRUD tests accepted a mutating request's success status as\nproof the mutation happened, with no follow-up read confirming it\nwas real.\n\n- 11.4.6_relationships.go: PUT/POST/DELETE $ref tests never re-verified\n  via GET — a server returning 204/201 without persisting the ref\n  change would hav\n[…]\n\n\nVerified individually and via a full v4.0 run (130 suites / 1010\ntests) against a live go-odata reference server: 0 failures, no\nregressions.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Verify mutations actually took effect, not just their own status code",
          "author_name": "Niklas Lahnstein",
          "author_login": "NLstn",
          "committed_at": "2026-07-18T09:14:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5d01dfac27dc38c9dcacd03c4fd6a571443a0737",
          "body": "Restriction-rejection tests (InsertRestrictions, UpdateRestrictions,\nCore.Permissions) POSTed/PATCHed empty or hardcoded-field bodies to\nprove a restriction is enforced. A 4xx from that request could equally\nmean \"missing required field\" — so a server with zero restriction\nenforcement could still pa\n[…]\nainst a live go-odata reference server: 14/14\nsuites pass, 38 tests, 0 failures (9 skips, all for optional\nannotations absent from this model).\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Use valid payloads and AssertODataError in vocabulary restriction tests",
          "author_name": "Niklas Lahnstein",
          "author_login": "NLstn",
          "committed_at": "2026-07-18T09:07:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "73a6ad3013d15ff5cfdc3cc2f72285ca8c4af0b5",
          "body": "Roughly half the filter and query-option test files checked only that\nevery *returned* row satisfies a predicate (AssertAllEntitiesSatisfy)\nor that the response was HTTP 200, never that the correct row set was\ncomplete. A server that silently drops matching rows, or applies no\nfiltering at all in so\n[…]\ner after each file:\nall converted suites pass, and a full v4.0 run (130 suites / 1010\ntests) shows no regressions from the stronger assertions.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Convert soundness-only filter/query tests to the oracle pattern",
          "author_name": "Niklas Lahnstein",
          "author_login": "NLstn",
          "committed_at": "2026-07-18T08:59:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a5ed8dcc51768b9933c7d9c377b74f924cc79295",
          "body": "Every compliance test in the suite depends on these 10 helpers being\ncorrect, but none had a single unit test of their own — a subtle\nregression in any one would silently corrupt every suite that uses it.\n\nAdds table-driven coverage for AssertStatusCode, AssertODataError,\nAssertHeader(Contains), Ass\n[…]\nmat\nrepresents Double NaN as the string \"NaN\", so it fails the float64\ntype assertion and errors clearly rather than comparing as always-false.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add unit tests for the framework's Assert* helpers",
          "author_name": "Niklas Lahnstein",
          "author_login": "NLstn",
          "committed_at": "2026-07-18T08:48:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "59a5189a4bb3b5aeccd64f4329557c9c91bdd304",
          "body": "AssertEntityOnlyAllowedFields — the only helper that can catch a server\nleaking unselected structural properties through $select — was defined\nbut never called anywhere in the suite. Every $select test only checked\nthat the requested fields were present, so a server that ignored\n$select entirely and\n[…]\nect tests in 11.2.5.2 and 11.4.1. Add a unit\ntest locking in both halves of the new behavior: annotations exempted,\ngenuine leaks still caught.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Verify $select completeness, not just presence",
          "author_name": "Niklas Lahnstein",
          "author_login": "NLstn",
          "committed_at": "2026-07-18T08:44:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4c22c4367d9a989191febe0488acc17cd02ca9b8",
          "body": "Run() returns nil for both a suite that genuinely passed and one where\nevery test was skipped (e.g. an under-declared capability), so a run\nthat skips everything could report 100% passing with zero assertions\nexecuted, and the SARIF writer emitted nothing at all for it — the\nworst failure mode for a\n[…]\nport). Add\nTestResults.AllSkipped(), surface it in the CLI summary, JSON report,\nand as a dedicated note-level SARIF result instead of silence.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Distinguish fully-skipped suites from passing ones",
          "author_name": "Niklas Lahnstein",
          "author_login": "NLstn",
          "committed_at": "2026-07-18T08:40:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7203b0b62f277cd6a4c9dde38d32dba23527a3fa",
          "body": null,
          "is_bot": false,
          "headline": "Require computed property values to be ignored",
          "author_name": "Nlstn",
          "author_login": "NLstn",
          "committed_at": "2026-07-12T16:45:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "80e35bef2e4d4e49a9e1bb0c182c2316fb5eaf60",
          "body": null,
          "is_bot": false,
          "headline": "Exercise include-annotations on an existing entity",
          "author_name": "Nlstn",
          "author_login": "NLstn",
          "committed_at": "2026-07-12T15:59:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "98cbad72a4c80d9ef1506a4e823351bfdfd23ff4",
          "body": null,
          "is_bot": false,
          "headline": "Isolate conditional delete test data",
          "author_name": "Nlstn",
          "author_login": "NLstn",
          "committed_at": "2026-07-11T18:23:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a18c07c7f9d79a9449c7d102bcabef26421596df",
          "body": null,
          "is_bot": false,
          "headline": "Support testing unreleased suite revisions",
          "author_name": "Nlstn",
          "author_login": "NLstn",
          "committed_at": "2026-07-11T18:23:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bd23ceffeaac73c5ac0ec151f4175baf872a4231",
          "body": null,
          "is_bot": false,
          "headline": "Audit and strengthen OData compliance coverage",
          "author_name": "Nlstn",
          "author_login": "NLstn",
          "committed_at": "2026-07-11T18:23:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e630dc742f12e1921a2c8c414d2b617424798a96",
          "body": "Both issues filed against go-odata during this session landed the same\nday (9d15a8f, 3c47cd9); the three tests that exposed them now pass\nagainst a fresh go-odata@main. Updates the in-code comments (no\nbehavioral test changes) and findings.md accordingly.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Update session 9 comments now that go-odata#800/#801 are fixed",
          "author_name": "Niklas Lahnstein",
          "author_login": "NLstn",
          "committed_at": "2026-07-06T04:35:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3df7d9fd0716f9930065fa73cb6569820fc7f52c",
          "body": "Replaces the last unconditional-return-nil tests (Guid/Single/Int16/\nBinary/Date/TimeOfDay/Duration \"in metadata\" checks, Core vocabulary\nannotations) with structural CSDL assertions, and strengthens five\nmisleadingly-named $orderby-with-$compute tests to actually verify\nsort order instead of just p\n[…]\n (NLstn/go-odata#800),\nand the $filter binary literal parser rejects the unpadded base64url\nform it itself now serializes (NLstn/go-odata#801).\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix remaining no-op tests, add Capabilities/Core vocabulary coverage",
          "author_name": "Niklas Lahnstein",
          "author_login": "NLstn",
          "committed_at": "2026-07-06T04:35:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "686d75e3cc511ddceb444a633b1cc11ffe15f65e",
          "body": "Tests should strictly enforce spec compliance. The two remaining failures\n(go-odata#783 nested lambda on M2M, go-odata#784 $apply=filter() count)\nare genuine spec violations that must show as CI failures until fixed.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Revert skip workarounds — tests must fail when go-odata is non-compliant",
          "author_name": "Niklas Lahnstein",
          "author_login": "NLstn",
          "committed_at": "2026-07-05T16:13:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "70515ec6a8d3b262172b9da6571eb1883cc17f3a",
          "body": "- test_query_option_case: add OData-MaxVersion: 4.0 header so the server\n  applies 4.0 strict mode where $FILTER (uppercase) is correctly rejected\n  with 400. OData 4.01 mandates case-insensitive options (§5.1.1) so the\n  test must negotiate 4.0 explicitly to test this behaviour.\n\n- Lambda nested tw\n[…]\no-odata#784).\n  Issue #771 was closed as \"can't reproduce\" but the defect is still\n  consistently reproduced against the current main branch.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix three test failures after go-odata bug fixes",
          "author_name": "Niklas Lahnstein",
          "author_login": "NLstn",
          "committed_at": "2026-07-05T16:13:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "68e79231e68ccfb4cf47862c7af8bb91db37001b",
          "body": "Adds 12 new test cases covering spec gaps (crossjoin, apply+filter oracle,\nFK constraints, duplicate key rejection, PATCH key immutability,\nPrefer: maxpagesize, external $filter on $apply result, nonexistent property\nerrors, pagination correctness, return=representation body validation).\n\nStrengthen\n[…]\nery options ($apply, $orderby, $top/$skip), data modification\n(POST/PATCH/DELETE), async requests, batch error handling, and header handling.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add new tests and strengthen assertions across 48 test files",
          "author_name": "Niklas Lahnstein",
          "author_login": "NLstn",
          "committed_at": "2026-07-05T16:13:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c978c7b57a5fa6b1f85a52fffcecd5e268761ab1",
          "body": "%24top in the error message was parsed as a format verb (%24t with arg\nresp.StatusCode of type int). Escape to %%24top so it prints literally.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix go vet format string in url_encoding test",
          "author_name": "Niklas Lahnstein",
          "author_login": "NLstn",
          "committed_at": "2026-07-04T16:14:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2a8f4b9cce97e483147e304ba01f0fc72fcc4135",
          "body": "- 11.2.5.13: assertSequentialIndexes(items, 2) — $skip=2 must produce\n  @odata.index starting at absolute position 2 (go-odata#763 fixed)\n- 8.2.8.6: remove Preference-Applied gate; assert null properties are\n  absent directly (go-odata#764 fixed)\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Restore strict assertions now that go-odata#763 and #764 are fixed",
          "author_name": "Niklas Lahnstein",
          "author_login": "NLstn",
          "committed_at": "2026-07-04T16:14:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c3cbb8dd698b15cf61ec32a27cecb933b4ee8d59",
          "body": "- 8.2.6: accept OData-Version 4.0 or 4.01 (reference server is a v4.01 impl)\n- 10.2: revert @odata.count to float64; OData JSON Format §7.2 says JSON integer\n- 11.2.5.7: drop exact combined-page count; server may paginate 3+3+1 not 3+4\n- 11.2.14: revert %24top to expect 200; HTTP decodes %24→$ befor\n[…]\n accept page-relative @odata.index start (server-behaviour variance)\n- 8.2.8.6: gate null-property absence check on Preference-Applied header\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix 6 CI regressions introduced by overly strict assertions",
          "author_name": "Niklas Lahnstein",
          "author_login": "NLstn",
          "committed_at": "2026-07-04T16:14:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fdc3454d87ddcaebe07aac609212e911fee86de4",
          "body": "Correctness fixes:\n- test_encoded_dollar_sign: expected 200→400 (§11.2.14, %24-prefixed param is invalid)\n- test_value_complex_type: expected 200→400 (§11.2.11, $value on complex type)\n- vocab assertODataError: remove assertion that error.code == HTTP status number (§9.3)\n- @odata.count: assert as s\n[…]\nmatch count\n- v4.01 8.2.8.6: verify null properties absent under Prefer: omit-values\n- v4.01 11.2.5.8: verify $compute DoublePrice == Price*2\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix correctness bugs and strengthen 60 assertions across 25 test files",
          "author_name": "Niklas Lahnstein",
          "author_login": "NLstn",
          "committed_at": "2026-07-04T16:14:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ceb9c368b8a092132cb3f943b3338772335ec1ca",
          "body": "- Remove \"known violation\" comment from test_singleton_select — the fix\n  in NLstn/go-odata#747 is confirmed working against main\n- Chained navigation test now surfaces NLstn/go-odata#749: the server\n  returns the intermediate entity instead of the terminal collection for\n  paths like /Products(id)/Category/Products\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Verify go-odata#747 fix; document chained navigation bug #749",
          "author_name": "Nlstn",
          "author_login": "NLstn",
          "committed_at": "2026-06-28T10:49:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9ad95f5608d2806494423cd30855b55269697fab",
          "body": "Replaced bare status-code-only checks with structural assertions:\n- Filter tests validate returned items satisfy the null/non-null predicate\n- Collection endpoints assert presence of the 'value' array\n- Entity endpoints assert '@odata.context' presence\n- Function/action endpoints validate OData JSON\n[…]\npe casting tests validate entity structure and type annotations\n- Singleton $select test references NLstn/go-odata#747 (known spec violation)\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Strengthen body validation across 11 test files",
          "author_name": "Nlstn",
          "author_login": "NLstn",
          "committed_at": "2026-06-28T10:49:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "da3471b385c26faf471d36c86c71a067809b5352",
          "body": "Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix gofmt alignment in metadata_helpers.go",
          "author_name": "Nlstn",
          "author_login": "NLstn",
          "committed_at": "2026-06-28T09:16:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ba4eef29a68dbee707d4cc89def51d342e9e9582",
          "body": "Replace AssertStatusCode(200)-only checks in the 5.1.x type suites,\n5.3 enum suite, 7.1.1 unicode suite, and 8.2.1 cache-control suite\nwith assertProductFilter oracle assertions that verify the returned\nentity set is exactly correct (both soundness and completeness).\n\nChanges by file:\n- 5.1.1.1: all\n[…]\nsults\n  #738 Status enum serialized as number instead of member-name string\n  #739 cast(CreatedAt,'Edm.Date') in $filter returns empty result\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Strengthen ~100 status-code-only tests with oracle-based assertions",
          "author_name": "Nlstn",
          "author_login": "NLstn",
          "committed_at": "2026-06-28T09:16:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "639be71669ab82f65043802797c48aaa2e8db964",
          "body": "The OData $search grammar (Part 1 §11.2.5.6) includes NOT: a negated term\nmatches records that do NOT contain it, and \"A NOT B\" means \"A AND (NOT B)\".\nAdded tests for an embedded NOT (must exclude the negated term) and a leading\nNOT (must return the complement, with HTTP 200).\n\nThe go-odata referenc\n[…]\nT (it ignores it for an\nembedded NOT and returns HTTP 500 for a leading NOT), so these tests fail\nagainst it until NLstn/go-odata#732 is fixed.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Assert $search NOT operator semantics",
          "author_name": "Nlstn",
          "author_login": "NLstn",
          "committed_at": "2026-06-27T21:32:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e31b463e2efb1274aa4fe628f28cf4d46feb42df",
          "body": "RFC 7231 §6.5.5 (referenced by OData Part 1 §8.1.5) requires a 405 response\nto include an Allow header listing the methods the resource supports. The\n8.1.7 suite checked the 405 status code on many resources but never the Allow\nheader, so a server omitting it passed.\n\nNote: the go-odata reference server does not currently emit this header, so\nthis test fails against it until NLstn/go-odata#729 is fixed.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Assert the Allow header on 405 Method Not Allowed responses",
          "author_name": "Nlstn",
          "author_login": "NLstn",
          "committed_at": "2026-06-27T21:05:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9e0dab1e80deb4dba4b207fcfd1c2384a4ca0026",
          "body": "OData JSON Format §7.1 requires enumeration values to be serialized as\nmember-name strings (for a flags enum, comma-separated, e.g. \"InStock,Featured\").\nThe suite must hold the service strictly to that and must not accept the legacy\nnumeric form as a fallback.\n\n- enumStatusValue (11.3.5): now requir\n[…]\nll suite passes against the go-odata#730 fix branch (string\nenum) and correctly fails against a server that still serializes enums\nnumerically.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Require strict OData string enum representation (no numeric fallback)",
          "author_name": "Nlstn",
          "author_login": "NLstn",
          "committed_at": "2026-06-27T21:03:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "678199ffd45f5f0bb730178c31c5c9bfe47f4810",
          "body": "OData JSON Format §7.1 requires enum values to be serialized as\nmember-name strings (e.g. \"InStock,Featured\") rather than integers.\nTests that assert on Status values used a float64 type assertion which\nbreaks when the server is spec-compliant.\n\n- Add enumStatusValue helper to 11.3.5 that accepts bo\n[…]\nertions in 11.3.5 to use enumStatusValue\n- Update the ne-operator Status assertion in 11.3.6 to accept both\n  numeric 0 and the string \"None\"\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix enum Status field checks to accept OData string representation",
          "author_name": "Nlstn",
          "author_login": "NLstn",
          "committed_at": "2026-06-27T20:02:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "14540b17c948432d87038b9bbcb068a1eebcf2c0",
          "body": "- 11.2.5.2 $orderby: added a nullable-property ordering test. Null sort rank is\n  service-defined, but nulls must be grouped at one end (never interleaved) and\n  the non-null values must be correctly ordered (Part 2 §5.1.4). Uses the\n  nullable ReleaseDate; skips if the seed has no null/non-null mix\n[…]\ns both constraints. Added an explicit-AND test (disjoint terms -> empty)\n  and a quoted-phrase test (matches the phrase, not individual terms).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Strengthen $orderby null handling and $search effect verification",
          "author_name": "Nlstn",
          "author_login": "NLstn",
          "committed_at": "2026-06-27T16:58:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c2b90fecdfd23d2a670fecfad5f6952974650eb0",
          "body": "- 9.1 service document: existing tests only inspected the first item. Added a\n  completeness test asserting every reference entity set (Products, Categories,\n  ProductDescriptions, MediaItems, ReadOnlyItems, DecimalSamples) and the\n  Company singleton are advertised with the correct kind and a non-e\n[…]\n (not just non-empty); Test 2 now requires a\n  text/plain Content-Type for a string property's $value rather than any\n  non-empty Content-Type.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Verify content of service document and property $value responses",
          "author_name": "Nlstn",
          "author_login": "NLstn",
          "committed_at": "2026-06-27T16:47:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b4f81f7a2adea7ff31aa833fb90d5d92a2ed1908",
          "body": "These tests previously asserted only presence (@odata.count exists) or an\nupper bound ($top returns \"at most\" N), so a server returning a wrong count or\nthe whole collection could pass.\n\n- 11.2.5.5 $count=true: assert @odata.count is a non-negative integer, is never\n  smaller than the page, and (abs\n[…]\nest verifies the\n  exact ordered page slice using $orderby=ID for determinism. Added\n  collectionSize/orderedProductIDs/pageProductIDs helpers.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Cross-check $count and $top/$skip against the actual collection",
          "author_name": "Nlstn",
          "author_login": "NLstn",
          "committed_at": "2026-06-27T16:47:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3acdf28cb61714e480e5403d547703882ccff701",
          "body": "… effect\n\nBoth 11.3.8 (filter on expanded/collection navigation) and 11.3.10 (filter on\nsingle-entity navigation) previously asserted only HTTP 200. A service that\nignored the navigation filter entirely — returning the full collection — passed\nevery test.\n\n- 11.3.8: rewrote all 12 tests around an or\n[…]\nr\n  on a non-existent category returns an empty set (catching an ignored filter),\n  and that filter+expand returns matching, expanded entities.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Strengthen navigation-property filter tests to verify the filter took…",
          "author_name": "Nlstn",
          "author_login": "NLstn",
          "committed_at": "2026-06-27T16:37:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3869743973b1142b4fbb033c91974ce5984ecc6b",
          "body": "…Data-Version\n\n- 8.2.2: the \"ETag present in GET response\" test unconditionally skipped\n  when no ETag was returned, so a service that drops ETags entirely passed\n  green. When the entity declares an optimistic-concurrency token in\n  $metadata (detected via entitySetConcurrencyDeclared), the service\n[…]\nh response carries the\n  OData-Version header, which §8.1.5 requires on every response and which\n  was previously unchecked on batch responses.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add missing mandatory checks: ETag when concurrency declared, batch O…",
          "author_name": "Nlstn",
          "author_login": "NLstn",
          "committed_at": "2026-06-27T16:17:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0267fdac5fff0a5bed4c0d4fd9997855a4ef79fa",
          "body": "- 5.1.1 DateTimeOffset: the filter literal was single-quoted\n  ('2025-12-31T23:59:59Z'), which is an Edm.String literal, not an\n  Edm.DateTimeOffset. Per OData Part 2 §5.1.1.6 these literals are bare.\n  A strict server would 400 the quoted form; use the bare literal.\n\n- Capabilities.UpdateRestrictio\n[…]\ng the\n  existing InsertRestrictions suite. Without a positive test, a service\n  that blocked *all* updates/deletes would have passed the suite.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix incorrect test logic in type and capability suites",
          "author_name": "Nlstn",
          "author_login": "NLstn",
          "committed_at": "2026-06-27T16:17:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "29c01a9cdc975ab49491c3ab0a2b752e21b602df",
          "body": "Several tests asserted behavior stricter than the OData v4.0/v4.01 specs\nrequire, causing them to fail conformant services:\n\n- AssertODataError required error.code to equal the HTTP status. Per\n  OData-JSON Format §19, code is a service-defined, language-independent\n  string (e.g. \"EntityNotFound\") \n[…]\n\n- Renamed the mislabeled \"PUT incomplete entity returns 400\" test to\n  reflect that it actually verifies PUT full-replacement reset semantics.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Stop failing spec-compliant servers in over-strict tests",
          "author_name": "Nlstn",
          "author_login": "NLstn",
          "committed_at": "2026-06-27T16:17:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "06b5c3e5ddaccc6d4cd8bac67855111f84b9ecdf",
          "body": "These were excluded from the initial semantic-depth commit because the\ngo-odata reference server returned wrong results for them. Those bugs are\nnow fixed on go-odata main (NLstn/go-odata #723, #724, #725), so the\ncoverage can be added with oracle-based assertions:\n\n- 5.3 enum types: 'has' operator \n[…]\n verifies\n  the disjunction is evaluated per range-variable iteration.\n\nValidated against go-odata main: full suite 152/152 scripts, 0 failing.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add has / totalseconds / or-in-lambda filter coverage",
          "author_name": "Nlstn",
          "author_login": "NLstn",
          "committed_at": "2026-06-27T15:40:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fe509fe95ee8b657126fb4ab9f81281dd648b755",
          "body": "Several suites asserted only HTTP 200, so a service returning a 200 with\nsemantically wrong data would pass. This replaces those checks with\noracle-based assertions: the expected result is computed in Go from a full\nfetch and compared against what the server returns (soundness AND\ncompleteness), mir\n[…]\nthe reference\nserver returns 400 / incorrect results for them, so adding strong tests now\nwould fail the reference gate; tracked for follow-up.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add semantic depth to filter & aggregation test suites",
          "author_name": "Nlstn",
          "author_login": "NLstn",
          "committed_at": "2026-06-27T15:40:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b6c20ac5761997ec67b201f6a1f57b68b907ef1b",
          "body": "Bumps [actions/checkout](https://github.com/actions/checkout) from 6 to 7.\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/v6...v7)\n\n---\nupdated-dependenc\n[…]\n:\n- dependency-name: actions/checkout\n  dependency-version: '7'\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump actions/checkout from 6 to 7",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-27T14:08:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3a6d84d30c85d632b12791610591731e4d697a96",
          "body": "Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 7.\n- [Release notes](https://github.com/actions/upload-artifact/releases)\n- [Commits](https://github.com/actions/upload-artifact/compare/v4...v7)\n\n---\nupdated-dependencies:\n- dependency-name: actions/upload-artifact\n  dependency-version: '7'\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump actions/upload-artifact from 4 to 7",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-27T14:08:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8f1eb5d814207bbda1aeed1e429bc6e898633537",
          "body": "The first version counted Nullable=\"false\" across the whole document and\ncompared it to the structural property count. That over-counted because\naction/function Parameter and ReturnType elements also carry Nullable\nfacets (74 vs 71 in the reference model), so the check failed against the\nconformant \n[…]\nstead: a\nstructural property is nullable when its own tag is not Nullable=\"false\".\nVerified against the go-odata reference server (14/14 pass).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix 4.2 nullable check: scope to <Property> tags",
          "author_name": "Nlstn",
          "author_login": "NLstn",
          "committed_at": "2026-06-27T14:05:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c93bc2047e924febcd3645f4bf225b636e5f5b9f",
          "body": "Several tests asserted the wrong thing — or nothing — giving false\nconfidence that a non-conformant service was passing:\n\n- 11.4.7 Deep Insert: every test posted a *flat* product (a CategoryID\n  foreign key, no nested entities), so deep insert was never exercised\n  despite being a headline feature. \n[…]\nd HTTP 200,\n  so a 5xx (server error) passed. A syntactically invalid Edm.Guid /\n  Edm.Binary / Edm.Duration literal must be rejected with 400.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix correctness bugs in compliance tests",
          "author_name": "Nlstn",
          "author_login": "NLstn",
          "committed_at": "2026-06-27T14:05:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "50451581dcd2bf5ea281852dee449fa3eae912c2",
          "body": "Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Restore reference operation URLs",
          "author_name": "Nlstn",
          "author_login": "NLstn",
          "committed_at": "2026-06-27T14:02:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c5b88bea49e0244190b4f8820ae40edd61112ba4",
          "body": "Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Use GUID category fixtures in write tests",
          "author_name": "Nlstn",
          "author_login": "NLstn",
          "committed_at": "2026-06-27T14:02:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "65742159278db2c7885de71deb4ac346f8a2afc6",
          "body": "Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Align operation tests with contract",
          "author_name": "Nlstn",
          "author_login": "NLstn",
          "committed_at": "2026-06-27T09:33:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "eda00887ef17dfb2238cc2b7bb4aef4bdacc9bcd",
          "body": "Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Fix reference compliance test assumptions",
          "author_name": "Nlstn",
          "author_login": "NLstn",
          "committed_at": "2026-06-27T09:27:26Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f2f1dbcfa65ba546956bd97aa68c95d7fb741488",
          "body": "Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Extend OData query compliance tests",
          "author_name": "Nlstn",
          "author_login": "NLstn",
          "committed_at": "2026-06-27T09:27:26Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1065cdcb90a1ea98892ed2379a14eed92bdc8b46",
          "body": "- framework: add Out io.Writer to TestSuite (defaults to os.Stdout);\n  route all 26 bare fmt.Print* calls in Run/PrintSummary/Log/debugRequest/\n  debugResponse through s.Out so framework output respects the structured-\n  format stdout redirect instead of always writing to os.Stdout\n\n- main: set suit\n[…]\nuences on\n  terminal detection and NO_COLOR; add --output validation that rejects the\n  flag when --format=text to avoid silently dropping it\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix six correctness issues found in code review",
          "author_name": "Niklas Lahnstein",
          "author_login": "NLstn",
          "committed_at": "2026-06-14T19:39:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "db7b0cc08de57fb6dd68165646fd7e6ab0411b1f",
          "body": "Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add structured output formats: JUnit XML, JSON, SARIF (closes #11)",
          "author_name": "Niklas Lahnstein",
          "author_login": "NLstn",
          "committed_at": "2026-06-14T19:05:45Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b0e4387c8221763a226f912f8ef11fddacddaf7e",
          "body": "Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix gofmt formatting in main.go",
          "author_name": "Niklas Lahnstein",
          "author_login": "NLstn",
          "committed_at": "2026-06-14T18:25:13Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c75a51f93f2b3d01338e4a5a87d7b9d44adb21fd",
          "body": "Tags all 152 test suites with Minimal/Intermediate/Advanced conformance\nlevels and feature areas. After each run the OVERALL SUMMARY is followed\nby a CONFORMANCE LEVEL REPORT showing the highest level fully met per\nOData version; --verbose additionally prints a per-feature matrix with\npassed/failed/skipped counts.\n\nCONFORMANCE.md documents the complete suite→level→feature mapping.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add OASIS conformance level reporting (closes #9)",
          "author_name": "Niklas Lahnstein",
          "author_login": "NLstn",
          "committed_at": "2026-06-14T18:25:13Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a3d01e11c216f53b842ad85105d1a45aa50043b0",
          "body": "Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix gofmt formatting in main.go capability requirements map",
          "author_name": "Niklas Lahnstein",
          "author_login": "NLstn",
          "committed_at": "2026-06-14T17:49:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8b0c5649ec8b5c389305637620d8d611833f05b9",
          "body": "Gate five mutation suites that were missing from the map:\n- 11.4.12_returning_results → CapInsert (all tests POST /Products)\n- 11.4.14_null_value_handling → CapInsert (first operation is POST)\n- 11.4.15_data_validation → CapInsert (all tests POST /Products)\n- 11.5.1_conditional_requests → CapUpdate \n[…]\nonly, not bound action\ninvocations, so using it as a proxy would produce false skips on\nservices that restrict CRUD but still expose actions.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix gaps in capability-aware test skipping",
          "author_name": "Niklas Lahnstein",
          "author_login": "NLstn",
          "committed_at": "2026-06-14T17:49:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "00cd09ed1d792db7a04eb64e97f59ec03e2b6f97",
          "body": "Before running suites the runner fetches $metadata and builds a\nCapabilityProfile from Org.OData.Capabilities.V1 annotations.  Suites\nthat depend on a feature the service has declared unsupported are\nrecorded as SKIPPED (not FAILED) so partial/read-only services receive\nan accurate compliance score \n[…]\n\nA new -strict flag disables this behaviour for services expected to be\nfully conformant.  Metadata parse failures are non-fatal (fail-open).\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add capability-aware test skipping (closes #8)",
          "author_name": "Niklas Lahnstein",
          "author_login": "NLstn",
          "committed_at": "2026-06-14T17:49:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "10c7f659b3a40555310f1a4ff3cfc373bdc3426b",
          "body": "Wire up an end-to-end harness that runs the suite against the go-odata\nreference implementation (NLstn/go-odata, cmd/complianceserver), so changes\ncan be validated against a known-good service.\n\n- scripts/run-reference.sh: clone/reuse go-odata, build & start its\n  compliance server, run the suite ag\n[…]\nE.md: usage and requirements.\n\nVerified locally against go-odata@main: 152/152 suites,\n1086 passed / 0 failed / 7 skipped, exit 0.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add reference compliance run against go-odata",
          "author_name": "Niklas Lahnstein",
          "author_login": "NLstn",
          "committed_at": "2026-06-14T16:53:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9ba671c0b2ac15efadc47d64a8f9685ad5ba306d",
          "body": "Bumps [goreleaser/goreleaser-action](https://github.com/goreleaser/goreleaser-action) from 6 to 7.\n- [Release notes](https://github.com/goreleaser/goreleaser-action/releases)\n- [Commits](https://github.com/goreleaser/goreleaser-action/compare/v6...v7)\n\n---\nupdated-dependencies:\n- dependency-name: goreleaser/goreleaser-action\n  dependency-version: '7'\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump goreleaser/goreleaser-action from 6 to 7",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-14T15:42:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d1324dfe71fe552eb305406dfc73df70103f2eab",
          "body": "Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 3 to 4.\n- [Release notes](https://github.com/docker/setup-buildx-action/releases)\n- [Commits](https://github.com/docker/setup-buildx-action/compare/v3...v4)\n\n---\nupdated-dependencies:\n- dependency-name: docker/setup-buildx-action\n  dependency-version: '4'\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump docker/setup-buildx-action from 3 to 4",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-14T15:41:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f3ab4e8a2ac574fc24e3339ed5e76eba22c0c702",
          "body": "Bumps [docker/login-action](https://github.com/docker/login-action) from 3 to 4.\n- [Release notes](https://github.com/docker/login-action/releases)\n- [Commits](https://github.com/docker/login-action/compare/v3...v4)\n\n---\nupdated-dependencies:\n- dependency-name: docker/login-action\n  dependency-version: '4'\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump docker/login-action from 3 to 4",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-14T15:41:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a515435b1d12300079fe24cdeefc3119b8600ec3",
          "body": null,
          "is_bot": false,
          "headline": "Add Dependabot config for GitHub Actions updates",
          "author_name": "Nlstn",
          "author_login": "NLstn",
          "committed_at": "2026-06-14T15:38:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4a0c0a06e56a16c20d65ad49e93b603c90929ec9",
          "body": "Pushing the v1 moving tag (for the Action ref) matched 'v*' and re-ran\nGoReleaser against the existing v1.0.0 release, failing with 422 already_exists.\nRestrict the trigger to 'v*.*.*' so only vX.Y.Z tags publish.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Trigger release only on full version tags, not the moving v1 tag (#3)",
          "author_name": "Nlstn",
          "author_login": "NLstn",
          "committed_at": "2026-06-14T15:35:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "732f9a1f2a7452db7390480b5e3115d8925bc200",
          "body": "GoReleaser's .Version strips the leading v, so the version tag was 1.0.0\nwhile the major tag was v1 — inconsistent. Use v{{ .Version }} so image tags\n(v1.0.0, v1, latest) match the git tags.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Prefix Docker image version tag with v for consistency (#2)",
          "author_name": "Nlstn",
          "author_login": "NLstn",
          "committed_at": "2026-06-14T15:24:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "608161833577215db93f27d5a4cde7e17c8503ba",
          "body": "…line (#1)\n\nMake the suite consumable by other repos/products locally and in CI:\n\n- action.yml: composite GitHub Action that downloads the released binary and\n  runs it on the runner host (so a service-under-test on localhost is reachable\n  with no container networking).\n- Dockerfile + .goreleaser.y\n[…]\n run) with the\n  go-odata worked example and the Docker localhost networking caveat.\n- .gitignore: ignore GoReleaser dist/ output.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add distribution: GitHub Action, Docker image, binaries, release pipe…",
          "author_name": "Nlstn",
          "author_login": "NLstn",
          "committed_at": "2026-06-14T15:20:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ffed87415732b03b9d77c975bec566adf074378c",
          "body": "Extracted from go-odata/compliance-suite. Black-box HTTP conformance\nsuite (~106 suites / ~669 tests) for OData v4.0 and v4.01 services.\n\n- Pure stdlib, no external dependencies\n- External-server-only runner (does not build/start a server)\n- Reference data-model documented in CONTRACT.md\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Initial commit: standalone OData v4 compliance test suite",
          "author_name": "nlstn",
          "author_login": null,
          "committed_at": "2026-06-14T14:06:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        }
      ],
      "releases_count": 5,
      "commits_last_year": 75,
      "latest_release_at": "2026-07-19T07:41:07Z",
      "latest_release_tag": "v1.0.3",
      "releases_from_tags": false,
      "days_since_last_push": 7,
      "active_weeks_last_year": 6,
      "days_since_latest_release": 8,
      "mean_days_between_releases": 8.7
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/nlstn/odata-compliance-suite",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/nlstn/odata-compliance-suite",
          "is_deprecated": false,
          "latest_version": "v1.0.3",
          "repository_url": "https://github.com/nlstn/odata-compliance-suite",
          "versions_count": 4,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-18T14:04:50Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 8
        }
      ]
    },
    "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,
        "collected_at": null
      },
      "open_issues_and_prs": 11
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 66611,
      "source_files_sampled": 181,
      "oversized_source_files": 1,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "go.mod"
      ],
      "advisories": {
        "error": "No resolved dependencies to assess",
        "scope": "repository_graph",
        "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": [
        "go"
      ],
      "dependencies": [],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [],
        "collected": true,
        "truncated": false,
        "total_count": 0,
        "direct_count": 0,
        "indirect_count": 0
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 1,
        "merged_prs": 56,
        "open_issues": 10,
        "closed_ratio": 0.231,
        "closed_issues": 3,
        "closed_unmerged_prs": 5
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "NLstn",
          "commits": 69,
          "avatar_url": "https://avatars.githubusercontent.com/u/9517868?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "reference.yml",
        "release.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 3,
            "reason": "branch protection is not maximal on development and all release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "25 out of 25 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/25 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 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": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 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": "eee4d3024decfa230533adb61292d9f473ddde77",
        "ran_at": "2026-07-27T08:02:04Z",
        "aggregate_score": 4.3,
        "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-26T11:02:33Z",
      "oldest_open_prs": [
        {
          "number": 75,
          "created_at": "2026-07-19T11:02:48Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-07-18T14:04:50Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 7,
          "created_at": "2026-06-14T15:57:16Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 10,
          "created_at": "2026-06-14T15:57:19Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 12,
          "created_at": "2026-06-14T15:57:22Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 13,
          "created_at": "2026-06-14T15:57:23Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 14,
          "created_at": "2026-06-14T15:57:24Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 15,
          "created_at": "2026-06-14T15:57:25Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 16,
          "created_at": "2026-06-14T15:57:26Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 17,
          "created_at": "2026-06-14T15:57:27Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 18,
          "created_at": "2026-06-14T15:57:28Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 19,
          "created_at": "2026-06-14T15:57:45Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/NLstn/odata-compliance-suite",
    "host": "github.com",
    "name": "odata-compliance-suite",
    "owner": "NLstn"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "at_risk",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 49,
      "inputs": {
        "security": 43,
        "vitality": 70,
        "community": 24,
        "governance": 44,
        "engineering": 61
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 70,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 57,
            "inputs": {
              "commits_last_year": 75,
              "human_commit_share": 0.933,
              "days_since_last_push": 7,
              "active_weeks_last_year": 6
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 7 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 7
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "6/52 weeks with commits",
                "points": 4.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "75 commits in the last year",
                "points": 16.9,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 75
                    }
                  }
                ],
                "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": 5,
              "latest_release_tag": "v1.0.3",
              "releases_from_tags": false,
              "days_since_latest_release": 8,
              "mean_days_between_releases": 8.7
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "5 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 8 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 8
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~8.7 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 8.7
                    }
                  }
                ],
                "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": "critical",
        "name": "Community & Adoption",
        "value": 24,
        "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": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "at_risk",
        "name": "Sustainability & Governance",
        "value": 44,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 10,
            "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 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "at_risk",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 46,
            "inputs": {
              "merged_prs": 56,
              "open_issues": 10,
              "closed_issues": 3,
              "issue_closed_ratio": 0.231,
              "closed_unmerged_prs": 5
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "23% of issues closed",
                "points": 10.8,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 23
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "56/61 decided PRs merged",
                "points": 35.1,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 56,
                      "decided": 61
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/25 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 43,
            "inputs": {
              "followers": 4,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "NLstn",
              "public_repos": 10,
              "account_age_days": 4284
            },
            "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": "4 followers of NLstn",
                "points": 5,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 4,
                      "login": "NLstn"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "10 public repos, account ~11 yr old",
                "points": 19.6,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 10
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 11
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "packages": [
                "github.com/nlstn/odata-compliance-suite"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 8
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on go",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "go"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 8 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 8
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "4 published versions",
                "points": 12,
                "status": "partial",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "moderate",
        "name": "Engineering Quality",
        "value": 61,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "3 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "25 out of 25 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 43,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": null,
            "notes": [],
            "value": 43,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 18,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 0,
              "scorecard_aggregate": 4.3
            },
            "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 is not maximal on development and all release branches",
                "points": 2.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "25 out of 25 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/25 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "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 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "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
              }
            ]
          }
        ],
        "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": 67,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.8,
              "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": "56 of 70 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 56,
                      "sampled": 70
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 74,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": true,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.853,
              "toolchain_manifests": [
                "go.mod"
              ],
              "dependency_bot_commit_share": 0.067
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "go.mod (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "go.mod"
                    }
                  }
                ],
                "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": "Go (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Dockerfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "64 of the last 75 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 64,
                      "sampled": 75
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "5 of the last 75 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 5,
                      "sampled": 75
                    }
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 66611,
              "source_files_sampled": 181,
              "oversized_source_files": 1
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Go (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "1/181 source files over 60KB",
                "points": 54.7,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 181,
                      "oversized": 1
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [],
  "report_type": "repository",
  "generated_at": "2026-07-27T08:02:20.144722Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/n/NLstn/odata-compliance-suite.svg",
  "full_name": "NLstn/odata-compliance-suite",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte StatistikenGo.