Informe JSON sin procesar legible por máquina
{
"data": {
"repo": {
"topics": [
"team-mesh"
],
"is_fork": false,
"size_kb": 311,
"has_wiki": true,
"homepage": null,
"languages": {
"Go": 273658
},
"pushed_at": "2026-07-24T14:38:50Z",
"created_at": "2026-06-17T12:14:37Z",
"owner_type": "Organization",
"updated_at": "2026-07-24T14:38:52Z",
"description": "Kuma 3.0 upgrade readiness preflight CLI for Kong Mesh / Kuma 2.x control planes",
"is_archived": false,
"is_disabled": false,
"license_spdx": null,
"default_branch": "main",
"license_spdx_raw": null,
"primary_language": "Go",
"significant_languages": [
"Go"
]
},
"owner": {
"blog": "https://konghq.com",
"name": "Kong",
"type": "Organization",
"login": "Kong",
"company": null,
"location": "San Francisco",
"followers": 1773,
"avatar_url": "https://avatars.githubusercontent.com/u/962416?v=4",
"created_at": "2011-08-06T02:08:16Z",
"is_verified": null,
"public_repos": 581,
"account_age_days": 5467
},
"license": {
"state": "absent",
"spdx_id": null,
"raw_spdx": null,
"file_present": false,
"scorecard_found": false,
"profile_has_license": false
},
"activity": {
"releases": [
{
"tag": "v0.4.0",
"kind": "minor",
"published_at": "2026-06-25T11:42:04Z"
},
{
"tag": "v0.3.0",
"kind": "minor",
"published_at": "2026-06-24T17:05:59Z"
},
{
"tag": "v0.2.0",
"kind": "minor",
"published_at": "2026-06-24T15:11:00Z"
},
{
"tag": "v0.1.0",
"kind": "minor",
"published_at": "2026-06-23T12:32:33Z"
}
],
"recent_commits": [
{
"oid": "987787ed98b2c69bf047ecf97d872c14083aa54e",
"body": "* refactor(audit): prune and refine 3.0 checks\n\nAudit-side changes for the 3.0 preflight report:\n\n- Remove the Gateway-in-Dataplane check: it fires for delegated\n gateways too, so it is not a 3.0 signal.\n- Remove the container-resources and Gateway-API/GAMMA manual\n checks.\n- Stop emitting the wor\n[…]\nd), and a comment referenced a\nnon-existent categoryRemoved identifier.\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>\n\n---------\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "refactor(audit): prune and refine 3.0 checks (#37)",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-07-24T14:38:48Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "deb593fb3c97e2a7060a623865f3d98996d80c60",
"body": "* ci(actions): block merge on stale example reports\n\nRe-render examples/html from the committed JSON fixtures in CI and fail if\nthe result differs from what is checked in, so a template change that\nskips regeneration cannot merge.\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>\n\n* ci(acti\n[…]\nendered HTML\nfails the gate; a bare `git diff` ignores untracked files.\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>\n\n---------\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "ci(actions): block merge on stale example reports (#26)",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-25T09:38:19Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e8abb37085a9a057f1e2dbf86e72580841f612cc",
"body": "MeshGlobalRateLimit is a Kong Mesh enterprise policy removed entirely in\n3.0 with no replacement, but the preflight had no check for it, so a CP\ncarrying these policies got a clean report.\n\nAdd checkRemovedEnterprisePolicies: list meshglobalratelimits and flag\nevery instance as a blocker. List via l\n[…]\nrage gap that flips the run to\ninconclusive.\n\nFix the deprecated-features doc row that wrongly claimed only the legacy\nOPA policy is removed.\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "feat(audit): flag removed MeshGlobalRateLimit (#25)",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-25T08:48:43Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8a8bc6cfcac5a2da23a81363e388948c20f1f1ac",
"body": "* feat(report): redesign report + example gallery\n\nRebuild the embedded HTML report (html.go) to stay readable on large\nmulti-mesh estates, and add a static example gallery rendered from\ncommitted fixtures.\n\nReport:\n- sticky sidebar table-of-contents with live per-severity/per-group\n counts and scr\n[…]\n CLI's own error) only when the render fails; a normal run stays quiet.\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>\n\n---------\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "feat(report): redesign report + example gallery (#24)",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-25T08:06:28Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4e9527adae41408d3366b6ece401333a94a45784",
"body": "* refactor(report): share JSON render helper\n\nrenderJSON and renderClassificationJSON were byte-identical;\nextract marshalIndentJSON(any) and drop the now-unused\nencoding/json import from classify_model.go.\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>\n\n* docs(examples): drop stale mark\n[…]\ninstall does not force\nCGO_ENABLED=0) in favor of the stdlib-only fact.\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>\n\n---------\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "chore(repo): prune stale docs/examples, simplify README (#23)",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-25T06:57:02Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "07074f4fdf03638f0df820f3f19259ee29702297",
"body": "* fix(client): clearer error for non-Kuma endpoint\n\nA 200 with a non-JSON body (HTML login/ingress page, wrong subpath\nlike /gui) decoded as the CP index leaked a raw \"invalid character\n'<'\" error. Treat a 200 whose body is not a JSON index as not-a-Kuma\nCP so audit() reports the friendly message. C\n[…]\nate the\nrest with their distinct message. Add a body-read-timeout test.\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>\n\n---------\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "fix(client): clearer error for non-Kuma endpoint (#22)",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-25T06:26:16Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "aab484ee3e0f3d0bb1567c94690b90efbb147fa4",
"body": "* feat(report): link blockers to Kong Mesh 3.0 docs\n\nEach blocker finding now carries a doc URL pointing at the Kong\nMesh page that explains its 3.0 replacement API/feature, surfaced\nin the JSON contract (doc, omitempty) and as a gated hyperlink on\nevery HTML finding card.\n\nNew addDoc() carries the \n[…]\n a whitespace-tolerant regex so spacing variants can't\nevade the guard.\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>\n\n---------\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "feat(report): link blockers to Kong Mesh 3.0 docs (#21)",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-25T04:37:18Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6dbf4f767b938b45c013a9048c84a19d5c165ce1",
"body": "Add .golangci.yml modeled on kumahq/kuma (same pinned 2.12.2),\ntrimmed for this stdlib-only single-package CLI: drop Kuma-only\nlinters/rules (protobuf depguard, importas aliases, ginkgolinter,\nloggercheck, tracing forbidigo), use gomodguard_v2, point gci/gofumpt\nat this module. Gofumpt+gci formattin\n[…]\nuiltin\nshadow), drop always-constant targetMinor param (unparam), unname\nreturns, modernize loops (slices.Backward/Contains, range-int, min).\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "build(lint): kuma golangci config + nilaway gate (#20)",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-24T19:48:47Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d33e0fd00c62c763d8926d5b27c1e5a6eb24964a",
"body": "Add detail + kubectl/jq detector command to the Gateway\nAPI / GAMMA manual check, and gate it on observed\nKubernetes: the dropped support is gateway.networking.k8s.io\nCRDs, absent on Universal.\n\nCommand lists Kuma GatewayClasses, the Gateways bound to\nthem and Service-attached (GAMMA) HTTPRoutes; empty output\nmeans nothing to migrate. Refresh golden reports.\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "feat(report): enrich gateway-api manual check (#17)",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-24T19:44:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "de1b3685f51da84d724333cd00bf9cf950b682de",
"body": "Detail + endpoint code block for the old-inspect-API card.\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "feat(report): inspect-API manual check detail (#19)",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-24T19:38:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a56440b61210102ad9fe124ec1491de8ced6457c",
"body": "* feat(report): HMAC256 signing-key detector card\n\nWire a detail + dual-platform (kubectl/kumactl) detector script into\nthe HMAC256 signing-key manual check, which was title-only. The script\nreads the token-signing-key Secrets and classifies each as RSA or a\nlegacy HMAC256 key; it never prints key m\n[…]\nhole\nscript is safe to paste in either a Kubernetes or Universal shell.\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>\n\n---------\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "feat(report): HMAC256 signing-key detector card (#18)",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-24T19:27:14Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "506cb625a49a6a635ef8edba6dc276d61a1b9393",
"body": "Read the coredns dependency kuma-dp reports in\n/dataplanes+insights (already fetched by checkDataplaneVersions)\nand block any proxy still on the legacy embedded-DNS path. This\ndetection is free and covers every connected proxy.\n\nDrop the DNS manual-check item (now auto-detected) and keep\n--inspect-dataplanes as the deep Envoy-config confirmation.\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "feat(audit): auto-detect legacy CoreDNS dataplanes (#16)",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-24T19:01:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fae2afed055bc6bb31c8cf0fb1af46ad07a94b58",
"body": "Move \"Pod resources instead of container resources\" off the\nalways-on list into the Kubernetes-gated cards (report.k8sObserved),\nadding an explanation and a kubectl version self-check command via\nthe manualCheck{title,detail,command} mechanism from #14. Universal\nand non-k8s runs no longer show it.\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "feat(report): pod-resources k8s manual check card (#12)",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-24T18:27:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7e6173b5f35d43a817ef415614fd41865b56e7c2",
"body": "* feat(report): k8s mesh-label manual check card\n\nAdd a Kubernetes-only manual check for the kuma.io/mesh\nannotation->label deprecation, rendered as a warning-style\ncard with an explanation and a copyable kubectl validation\ncommand (clipboard API + execCommand fallback for file://).\n\nManual checks b\n[…]\ns render as\nNamespace/<name> instead of an ambiguous Namespace//<name>.\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>\n\n---------\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "feat(report): k8s mesh-label manual check card (#14)",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-24T17:20:42Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8140a30d31ed033c8b41f523411885c8e562831d",
"body": "ZoneIngress/ZoneEgress are replaced by the unified Zone Proxy in\n3.0, so their presence is an actionable upgrade item, not an\ninformational count. Elevate the \"Zone proxies\" finding from info\nto blocker (gates CI, exit 1) and make the detail actionable.\n\nRemaining info findings are non-actionable co\n[…]\nled-dataplane inspection coverage; no-zones-connected).\n\nUpdate render/classify tests, golden ref, severity-rule table,\nREADME and test docs.\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "feat(audit): flag zone proxies as blocker (#15)",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-24T17:16:35Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "835d0304deca8dd6f0eb35885e287e363fdb3a76",
"body": "* feat(report): tables + global group in classify\n\nClassify report repeated the same cross-cutting fixes (inline mTLS,\nshared MeshTimeout/MeshTrafficPermission defaults) in nearly every\nsuite, drowned in per-row emojis.\n\n- Lift recurring non-removable fixes (>=3 suites) into one Global\n migrations \n[…]\n. Word as\n\"when present\" to match the renderer (len(m.Global)==0 skip).\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>\n\n---------\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "feat(report): tables + global group in classify (#13)",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-24T17:04:33Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c23e9bc67c7ce69dc55c8af1b21d4dd8672d3d64",
"body": "Convert the manual \"adopt Workload for proxy grouping\" item into\nauto-detected findings from CP config and Dataplane labels:\n\n- k8s: warn when runtime.kubernetes.workloadLabels is unset\n (kuma.io/workload falls back to the pod ServiceAccount)\n- Universal: blocker for a Dataplane missing the kuma.io\n[…]\ng < info) that\ndoes not gate CI; a run with only warnings stays clean (exit 0).\nRender it across JSON + HTML; summary gains a warnings count.\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "feat(audit): detect Workload grouping readiness (#10)",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-24T16:39:25Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f34eb3aa053d4a65a66f3d846efa37559c0e1db4",
"body": "* refactor(audit): drop zone-pinned manual check\n\nEvery legacy ExternalService is already flagged a blocker by\ncheckLegacyResources, so the manual reminder added no coverage.\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>\n\n* refactor(audit): drop observability manual check\n\nRemove the 'install observability' manual reminder from the\nmanual-checks list.\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>\n\n---------\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "refactor(audit): drop redundant manual checks (#11)",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-24T16:29:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f87cc90320c5112eb0335c7a6a392a594016cb74",
"body": "Flag any control plane (and, on a global, every connected zone) not on\nthe latest 2.14 patch — the only supported 3.0 upgrade source. Latest\npatch resolved from kumahq/kuma GitHub releases (Link-paginated, on its\nown timeout); --latest-version overrides for offline/deterministic runs.",
"is_bot": false,
"headline": "feat(audit): check control plane patch version (#9)",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-24T15:35:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "04697df6949d2e4fe4d5c7c68a03c70ab916078e",
"body": "* ci(actions): auto-bump+tag, allow manual version\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>\n\n* ci(actions): tighten semver prerelease regex\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>\n\n---------\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "ci(actions): auto-bump+tag, allow manual version (#8)",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-24T15:09:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "675231835f27bceb85188fdf3bd85dd551576059",
"body": "Prettify the --classify markdown (the Kuma e2e job summary): wrap\neach env in a collapsible <details open> with headline counts, nest\neach test suite in its own <details>, add a per-recommendation summary\ntable, and mark severity (remove/rewrite) and category with emoji. The\n~2,000-line job summary \n[…]\nay: --classify\ningests the audit's per-spec JSON snapshots. The JSON contract for both\nreports is unchanged. Tests and docs updated to match.\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "feat(report): collapsible emoji classify report (#7)",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-24T14:57:28Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b79e0b030790920445d9b58821c6b6daaee9e018",
"body": "to[].targetRef.kind: Mesh is valid in Kuma 3.0 (canonical\nall-outbound form, and the only kind permitted for\nMeshGateway-targeted policies); MeshHTTPRoute is valid too. The\naudit flagged both as removed, producing false-positive blockers\non the CP's own auto-generated default policies (verified agai\n[…]\nven ones with no finding. Make ref() pure and count via\ncountSystem only when a resource actually yields a finding\n(tracked by report.total).\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "fix(audit): allow to[] targetRef Mesh kind (#6)",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-24T14:42:56Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "81232b7921e7bc7d118110f548fd38aef806a784",
"body": "* feat(report): group findings into sections\n\nFindings are organized into six top-level groups above the existing\ncategory subheadings: Control plane, Mesh object, Policies, Removed\nresources, Data plane & workloads, Other. Each category maps to one\ngroup via a single table; an unmapped category fal\n[…]\nender identically. Adds a regression test for\nthe group-less load path.\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>\n\n---------\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "feat(report): group findings into sections (#5)",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-24T13:52:26Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5e173b2e8af58d9c5ee0368c2bc1fde5aa3d14c7",
"body": "* feat(html): clickable mesh chips filter findings\n\nMesh chips in the report header become toggle buttons; clicking one\nfilters the findings list to that mesh, narrowing each finding's\nexamples and counts. Control-plane-wide findings (no mesh) stay\nvisible under any mesh filter since they apply to e\n[…]\nops the earlier per-mesh floor marker,\nwhich understated the same case.\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>\n\n---------\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "feat(html): clickable mesh chips filter findings (#4)",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-24T13:18:05Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3a8066f0f52e8029f4ddc137d151042dd155d2eb",
"body": "* feat(preflight): add e2e classification mode\n\nAdd a --classify mode that reuses the deprecation catalog (legacyMeshScoped, audit.go) to classify an e2e test tree by which Kuma-3.0-removed features each test exercises: static source scan + optional per-spec snapshot ingestion, grouped into remove/r\n[…]\natch.\n- Skip (do not abort on) a non-report .json in the snapshots dir.\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>\n\n---------\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "feat(preflight): add e2e classification + release (#2)",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-23T12:29:29Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "02ca07b77f06679cf764b51776c9e858ac717c90",
"body": "* ci(actions): lint, test, build on PR and main\n\nAdd a CI workflow that runs gofmt, go vet, golangci-lint, go test,\nand go build on every pull request and on pushes to main. Tooling is\npinned via mise (go + golangci-lint).\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>\n\n* ci(actions): go\n[…]\nfmt already recurses; this just\nwidens coverage and removes ambiguity.)\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>\n\n---------\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "ci(actions): lint, test, build on PR and main (#3)",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-23T12:19:28Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "dea659c5c852719dc4cfa181f710f4c26c4e400f",
"body": "Remove the warning severity tier; every actionable finding is now a\nblocker (exit 1). Only blocker + info remain. Drop summary.warnings and\nbump reportSchema to v2 (incompatible JSON change).\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "feat(preflight): treat all warnings as blockers (#1)",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-22T11:11:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2d09c2cac2564869cf3c24b7ac97b89e9532406c",
"body": "Detect global mode from /config and source each zone's control-plane\nconfig from /zones+insights (ZoneInsight), so one run against the\nglobal covers the whole multizone estate. The global keeps only the\nglobal-on-k8s blocker; data-plane config checks run per zone, tagged\n\"zone <name>\". The CP mode (\n[…]\n failures (auth, timeout) to\ncoverage gaps instead of aborting the run, and document --token for\nKong Mesh CPs that gate /config behind RBAC.\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "feat(preflight): audit all zones from global CP",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-22T09:13:03Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2f6b2f7d9cd49e64eab382f094210dfb530e3b76",
"body": "- CLI README: add --inspect-dataplanes flag and new checks.\n- test-setup §6 + test-plan B-15..B-17: cover /config, dataplane\n version/metrics, and opt-in Envoy DNS-filter inspection.\n- adding-checks rule: refresh the severity table.\n- Add a captured HTML example report (examples/html).\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "docs(preflight): document API-derived checks",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-19T08:11:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ec342f4289a576eea46e3a846a0049860ed2a17b",
"body": "Audit settings the CP exposes that the resource scan can't see:\n\n- checkControlPlaneConfig (GET /config): blockers for global-on-k8s,\n autoReachableServices, eBPF, unified-naming off, inbound-tags\n enabled; warnings for deltaXds/KDS-watchdog/sidecar off.\n- checkDataplaneVersions (/dataplanes+insig\n[…]\nplanes N: opt-in Envoy config-dump scan for the\n legacy envoy.filters.udp.dns_filter.\n- Promote meshServices.mode != Exclusive to a blocker.\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "feat(preflight): add CP config + dataplane checks",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-19T08:11:37Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4fbef182bf9ddecb615ecffdef2a1d3b55fea7a0",
"body": "- drop countBlockers; use count(blocker)\n- audit() check chain -> slice loop\n- failureContent delegates to renderFormat\n- add listIfServed (404 = not-applicable, not a gap)\n- add unmarshalSpec parse-error guard\n- table-drive Mesh hasJSON blockers\n\nNo behavior change; tests/vet/gofmt/lint clean.\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "refactor(preflight): dedupe audit + render helpers",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-17T13:32:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "295c74747bb842eed43a4a9925ddd6cd175639da",
"body": "Signed-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "test(preflight): parametrize dataplane checks",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-17T13:15:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "93ee8bde283a3308c247f95fc227bb5212a9dcd6",
"body": "Signed-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "test(preflight): parametrize mesh deprecations",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-17T13:02:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "15133cfed14aba69f9d45f215fd5c442376336ae",
"body": "Signed-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "docs(claude): document golden test harness",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-17T12:47:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "021828e3d8344bb9fcf9cbe479a72608f8203d2a",
"body": "Signed-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "test(preflight): add mock-CP golden JSON tests",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-17T12:46:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9524b6a590f619d4a19ef93d7bfd963ca419696d",
"body": "Signed-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "refactor(module): rename module path",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-17T12:31:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bde102c0d6a82b81c769d8a294015ce298d001b2",
"body": "Signed-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "docs(claude): add project instructions and rules",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-17T12:16:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a3a7c1a34b903140c42c7c4251b2919fbbe93c4a",
"body": "Signed-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "build(mise): add build, test, check tasks",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-17T12:16:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1762328946d9856ce8ed7411e1593769d3841f5a",
"body": "Signed-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "feat(preflight): add model + HTML/JSON renderers",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-17T12:16:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3e107c9270b7f5e26717ceea06b9149e7911d3de",
"body": "Blocker count is already in the header and the Blockers section\nlists them; the redundant banner line is removed. Examples\nregenerated. Adds mise.toml toolchain pin.\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "fix(report): drop blocker banner from summary",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-17T09:28:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "aea7d16e51009cc4fe061e93874024cb1a111ed0",
"body": "Captured against live 2.x CPs with the test-setup fixtures. Shows the\nk8s-vs-universal policy-role:system labeling difference.\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "docs(examples): add real k8s + universal reports",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-17T09:18:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "809ee7b6b9689fed31311a063738d68d58fdd25e",
"body": "Standalone repo for the Kuma 2.x -> 3.0 upgrade pre-flight CLI\nand its manual test plan/results/setup. stdlib-only; audits a CP\nover REST and reports blockers/warnings/manual checks. Verified\nagainst k3d (k8s) and a local universal CP.\n\nSigned-off-by: Marcin Skalski <skalskimarcin33@gmail.com>",
"is_bot": false,
"headline": "feat(preflight): import v3-readiness audit tool",
"author_name": "Marcin Skalski",
"author_login": "Automaat",
"committed_at": "2026-06-17T09:15:47Z",
"body_truncated": false,
"is_coding_agent": false
}
],
"releases_count": 4,
"commits_last_year": 42,
"latest_release_at": "2026-06-25T11:42:04Z",
"latest_release_tag": "v0.4.0",
"releases_from_tags": false,
"days_since_last_push": 0,
"active_weeks_last_year": 3,
"days_since_latest_release": 30,
"mean_days_between_releases": 0.7
},
"community": {
"has_readme": true,
"has_license": false,
"has_description": true,
"has_contributing": false,
"health_percentage": 25,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "github.com/Kong/kong-mesh-v3-readiness",
"exists": true,
"license": null,
"keywords": [],
"ecosystem": "go",
"matches_repo": true,
"registry_url": "https://pkg.go.dev/github.com/Kong/kong-mesh-v3-readiness",
"is_deprecated": false,
"latest_version": "v0.4.0",
"repository_url": "https://github.com/Kong/kong-mesh-v3-readiness",
"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-06-25T09:38:19Z",
"latest_version_yanked": null,
"days_since_latest_publish": 30
}
]
},
"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": 0
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [
"examples"
],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [
"mise.toml"
],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [
"go.mod"
],
"largest_source_bytes": 59921,
"source_files_sampled": 20,
"oversized_source_files": 0,
"agent_instruction_files": [
"CLAUDE.md"
],
"agent_instruction_max_bytes": 3731
},
"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": 0,
"merged_prs": 28,
"open_issues": 0,
"closed_ratio": 1,
"closed_issues": 10,
"closed_unmerged_prs": 0
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "Automaat",
"commits": 42,
"avatar_url": "https://avatars.githubusercontent.com/u/9156357?v=4"
}
],
"contributors_sampled": 1,
"top_contributor_share": 1
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"ci.yml",
"release.yml"
],
"has_docs_dir": true,
"linter_configs": [
".golangci.yml"
],
"has_editorconfig": false,
"has_linter_config": true,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": 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": 9,
"reason": "26 out of 27 merged PRs checked by a CI test -- score normalized to 9",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 0,
"reason": "Found 0/30 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 3,
"reason": "project has 1 contributing companies or organizations -- score normalized to 3",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": 10,
"reason": "no dangerous workflow patterns detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 0,
"reason": "no update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 0,
"reason": "license file not 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": 10,
"reason": "all dependencies are pinned",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 8,
"reason": "SAST tool is not run on all commits -- score normalized to 8",
"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": "987787ed98b2c69bf047ecf97d872c14083aa54e",
"ran_at": "2026-07-25T14:00:51Z",
"aggregate_score": 4.2,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-24T14:39:50Z",
"oldest_open_prs": [],
"last_merged_pr_at": "2026-07-24T14:38:48Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": []
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/Kong/kong-mesh-v3-readiness",
"host": "github.com",
"name": "kong-mesh-v3-readiness",
"owner": "Kong"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 56,
"inputs": {
"security": 42,
"vitality": 68,
"community": 12,
"governance": 63,
"engineering": 83
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "moderate",
"name": "Vitality",
"value": 68,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "moderate",
"name": "Development activity",
"note": null,
"notes": [],
"value": 53,
"inputs": {
"commits_last_year": 42,
"human_commit_share": 1,
"days_since_last_push": 0,
"active_weeks_last_year": 3
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 0 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 0
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "3/52 weeks with commits",
"points": 2.1,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 3
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "42 commits in the last year",
"points": 14.7,
"status": "partial",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 42
}
}
],
"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": 4,
"latest_release_tag": "v0.4.0",
"releases_from_tags": false,
"days_since_latest_release": 30,
"mean_days_between_releases": 0.7
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "4 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 4
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 30 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 30
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~0.7 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 0.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": 12,
"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": "critical",
"name": "Community health",
"note": null,
"notes": [],
"value": 25,
"inputs": {
"has_readme": true,
"has_license": false,
"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": "no license file detected",
"points": 0,
"status": "missed",
"details": [
{
"code": "license_absent",
"params": {}
}
],
"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": "moderate",
"name": "Sustainability & Governance",
"value": 63,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 13,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 1,
"top_contributor_share": 1
},
"components": [
{
"key": "bus_factor",
"name": "Bus factor",
"detail": "1 contributor(s) cover half of all commits",
"points": 9,
"status": "partial",
"details": [
{
"code": "bus_factor",
"params": {
"count": 1
}
}
],
"max_points": 54
},
{
"key": "commit_distribution",
"name": "Commit distribution",
"detail": "top contributor authored 100% of commits",
"points": 0,
"status": "missed",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 100
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "1 contributors",
"points": 1.4,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 1
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 3,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "excellent",
"name": "Issue & PR responsiveness",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"merged_prs": 28,
"open_issues": 0,
"closed_issues": 10,
"issue_closed_ratio": 1,
"closed_unmerged_prs": 0
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "100% of issues closed",
"points": 46.8,
"status": "met",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 100
}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "28/28 decided PRs merged",
"points": 38.2,
"status": "met",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 28,
"decided": 28
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "good",
"name": "Ownership & stewardship",
"note": null,
"notes": [],
"value": 78,
"inputs": {
"followers": 1773,
"owner_type": "Organization",
"is_verified": null,
"owner_login": "Kong",
"public_repos": 581,
"account_age_days": 5467
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "organization-owned",
"points": 30,
"status": "met",
"details": [
{
"code": "owner_organization",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "1,773 followers of Kong",
"points": 23.4,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 1773,
"login": "Kong"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "581 public repos, account ~14 yr old",
"points": 25,
"status": "met",
"details": [
{
"code": "public_repos",
"params": {
"count": 581
}
},
{
"code": "account_age_years",
"params": {
"years": 14
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 92,
"inputs": {
"packages": [
"github.com/Kong/kong-mesh-v3-readiness"
],
"ecosystems": "go",
"any_deprecated": false,
"min_days_since_publish": 30
},
"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 30 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 30
}
}
],
"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": "good",
"name": "Engineering Quality",
"value": 83,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "good",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 82,
"inputs": {
"has_ci": true,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": true,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": "2 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 2
}
}
],
"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": ".golangci.yml",
"points": 16,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": ".golangci.yml"
}
}
],
"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": "26 out of 27 merged PRs checked by a CI test -- score normalized to 9",
"points": 18,
"status": "partial",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "excellent",
"name": "Documentation",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"topics": [
"team-mesh"
],
"has_wiki": true,
"homepage": null,
"has_readme": true,
"has_docs_dir": true,
"has_description": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 25,
"status": "met",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": 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": "1 topics",
"points": 10,
"status": "met",
"details": [
{
"code": "topics_count",
"params": {
"count": 1
}
}
],
"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": 42,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "at_risk",
"name": "Security posture",
"note": null,
"notes": [],
"value": 42,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 18,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 0,
"scorecard_aggregate": 4.2
},
"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": "26 out of 27 merged PRs checked by a CI test -- score normalized to 9",
"points": 2.2,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 0.8,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "no update tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file not detected",
"points": 0,
"status": "missed",
"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": "all dependencies are pinned",
"points": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "SAST tool is not run on all commits -- score normalized to 8",
"points": 4,
"status": "partial",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "Project has not signed or included provenance with any releases.",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "detected GitHub workflow tokens with excessive permissions",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "0 existing vulnerabilities detected",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
}
]
},
{
"key": "high_risk_jurisdiction_exposure",
"band": "excellent",
"name": "High-Risk Jurisdiction Exposure",
"note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
"notes": [
{
"code": "jurisdiction_evidence_limits",
"params": {}
}
],
"value": 100,
"inputs": {
"meaning": "self-published location evidence; not nationality or citizenship",
"red_flag": false,
"exposures": [],
"policy_countries": [
"Russia",
"Iran",
"North Korea"
],
"review_only_matches": 0,
"assessed_self_published_locations": 2
},
"components": [
{
"key": "policy_exposure_multiplier",
"name": "Policy exposure multiplier",
"detail": "no confirmed policy-scope location match",
"points": 100,
"status": "met",
"details": [
{
"code": "jurisdiction_no_match",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "good",
"name": "AI Readiness",
"value": 75,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "excellent",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 1,
"agent_instruction_files": [
"CLAUDE.md"
],
"agent_instruction_max_bytes": 3731
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "CLAUDE.md",
"points": 45,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "CLAUDE.md"
}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "42 of 42 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 42,
"sampled": 42
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "good",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 72,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [],
"has_dockerfile": false,
"typed_language": true,
"bootstrap_files": [
"mise.toml"
],
"has_devcontainer": false,
"has_linter_config": true,
"typecheck_configs": [],
"agent_commit_share": 0,
"toolchain_manifests": [
"go.mod"
],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "mise.toml",
"points": 18,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "mise.toml"
}
}
],
"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": ".golangci.yml",
"points": 11,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": ".golangci.yml"
}
}
],
"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": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "no agent-authored commits among the last 42",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_authored_commits",
"params": {
"sampled": 42
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "no automated dependency updates observed",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_dependency_automation",
"params": {}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "all dependencies are pinned",
"points": 10,
"status": "met",
"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": 59921,
"source_files_sampled": 20,
"oversized_source_files": 0
},
"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": "0/20 source files over 60KB",
"points": 55,
"status": "met",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 20,
"oversized": 0
}
}
],
"max_points": 55
}
]
},
{
"key": "ai_interfaces",
"band": "at_risk",
"name": "Machine-readable interfaces",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"example_dirs": [
"examples"
],
"has_mcp_signal": false,
"api_schema_files": []
},
"components": [
{
"key": "api_schema_openapi_graphql_proto",
"name": "API schema (OpenAPI/GraphQL/proto)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 40
},
{
"key": "mcp_server",
"name": "MCP server",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
},
{
"key": "runnable_examples",
"name": "Runnable examples",
"detail": "examples",
"points": 40,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "examples"
}
}
],
"max_points": 40
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
}
],
"metrics_version": "1.13.0"
},
"warnings": [],
"report_type": "repository",
"generated_at": "2026-07-25T14:01:07.062624Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/k/Kong/kong-mesh-v3-readiness.svg",
"full_name": "Kong/kong-mesh-v3-readiness",
"license_state": "absent",
"license_spdx": null
}