Informe JSON sin procesar legible por máquina
{
"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"
}