JSON-Rohbericht maschinenlesbar
{
"data": {
"repo": {
"topics": [
"ci",
"linter",
"prometheus",
"promql",
"testing-tools",
"static-analysis",
"conall-portfolio",
"observability",
"site-reliability-engineering",
"sre",
"agent-skills"
],
"is_fork": false,
"size_kb": 270,
"has_wiki": true,
"homepage": null,
"languages": {
"Go": 216547,
"Shell": 10747,
"Makefile": 2684
},
"pushed_at": "2026-07-21T16:10:00Z",
"created_at": "2026-01-09T02:02:59Z",
"owner_type": "User",
"updated_at": "2026-07-21T16:11:47Z",
"description": "Various static analysis and testing tools for managing PromQL compatible monitoring stacks",
"is_archived": false,
"is_disabled": false,
"license_spdx": "BSD-3-Clause",
"default_branch": "main",
"license_spdx_raw": "BSD-3-Clause",
"primary_language": "Go",
"significant_languages": [
"Go"
]
},
"owner": {
"blog": "https://www.conall.net",
"name": "Conall O'Brien",
"type": "User",
"login": "conallob",
"company": "@crusoecloud, Previously @google, @docusign",
"location": "Dublin, Ireland",
"followers": 12,
"avatar_url": "https://avatars.githubusercontent.com/u/7395717?v=4",
"created_at": "2014-04-24T13:45:51Z",
"is_verified": null,
"public_repos": 76,
"account_age_days": 4477
},
"license": {
"state": "standard",
"spdx_id": "BSD-3-Clause",
"raw_spdx": "BSD-3-Clause",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v0.0.10",
"kind": "patch",
"published_at": "2026-07-18T13:30:39Z"
},
{
"tag": "v0.0.9",
"kind": "patch",
"published_at": "2026-05-16T22:55:40Z"
},
{
"tag": "v0.0.8",
"kind": "patch",
"published_at": "2026-05-15T23:47:54Z"
},
{
"tag": "v0.0.7",
"kind": "patch",
"published_at": "2026-01-26T23:54:51Z"
},
{
"tag": "v0.0.6",
"kind": "patch",
"published_at": "2026-01-23T10:13:03Z"
},
{
"tag": "v0.0.5",
"kind": "patch",
"published_at": "2026-01-12T15:42:09Z"
},
{
"tag": "v0.0.4",
"kind": "patch",
"published_at": "2026-01-12T14:46:59Z"
},
{
"tag": "v0.0.3",
"kind": "patch",
"published_at": "2026-01-11T02:21:28Z"
},
{
"tag": "v0.0.2",
"kind": "patch",
"published_at": "2026-01-10T01:56:58Z"
},
{
"tag": "v0.0.1",
"kind": "patch",
"published_at": "2026-01-09T17:39:33Z"
}
],
"recent_commits": [
{
"oid": "b5106be06b3bf9deb620e7d7c01061d6ba4de5fc",
"body": null,
"is_bot": false,
"headline": "Add link to https://supah.green , wordwrap the section again",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-07-21T16:10:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2a135fc648dedc97bf9dee501982ed86f7444a54",
"body": "…l-sc2f8m\n\ndocs: unify tool ordering, add TOCs, retire PROMQL-CODY.md",
"is_bot": false,
"headline": "Merge pull request #27 from conallob/claude/promql-cody-plugin-instal…",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-07-21T16:07:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f9c300188044afab956e8a385b96a0f44cdad7e5",
"body": "Reorder the six CLI tools consistently (hermetic-first: promql-fmt,\nlabel-check, autogen-promql-tests, e2e-alertmanager-test, then the two\ninteractive/historical-data tools alert-hysteresis and\nstale-alerts-analyzer) across README.md's Tools section, docker pull\nlist, and build-from-source commands,\n[…]\ndy/SKILL.md. Update\nAGENTS.md and INSTALLING.md references accordingly.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01XrdXjJWggYgocu5fJ88aXZ",
"is_bot": false,
"headline": "docs: unify tool ordering, add TOCs, retire PROMQL-CODY.md",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-07-21T15:08:12Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f11915c4d2281127974db6a92c05c916933387eb",
"body": null,
"is_bot": false,
"headline": "Merge pull request #26 from conallob/docs/agents-md",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-07-18T17:11:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "98081ff858e45441c1bd49b3c566104340118a79",
"body": "Adds skills/promql-cody/SKILL.md — a proper SKILL.md with YAML\nfrontmatter (name, description, license) containing the orchestration\nguidance previously only in the root PROMQL-CODY.md doc. It's now\ninstallable the same way as the six per-tool skills: local copy, the\nClaude Code plugin marketplace (\n[…]\nat skills/promql-cody/ is\ninstallable and PROMQL-CODY.md itself is not.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KhqSSdtMaV2MRJaTWwNihy",
"is_bot": false,
"headline": "feat(skills): convert PromQL-Cody into a real, installable Agent Skill",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-07-18T14:19:59Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f8ee68ea96a71e4adf3235915850d77f9b935955",
"body": "Note each tool also publishes a standalone ghcr.io image per release,\nuseful for running the hermetic tools as a CI step without a Go\ntoolchain on the runner.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KhqSSdtMaV2MRJaTWwNihy",
"is_bot": false,
"headline": "docs(agents-md): mention ghcr.io container images for CI pipelines",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-07-18T14:15:37Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "8f30f22a673adccda9a3514bba68468b8d031f58",
"body": "…y install\n\nPROMQL-CODY.md was only a bullet under the per-tool skills list;\ngive it its own \"PromQL-Cody: the unified agent\" section so it reads\nas the entry point it's meant to be, and note it isn't itself an\ninstallable SKILL.md directory. Also document that the CLI binaries\n(separately from the \n[…]\nl via Homebrew\n(conallob/tap/o11y-analysis-tools), not just go install.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KhqSSdtMaV2MRJaTWwNihy",
"is_bot": false,
"headline": "docs(agents-md): give PromQL-Cody its own section, add Homebrew binar…",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-07-18T14:14:41Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "accfd1769f905f29b2678d188cd2db7e2405db55",
"body": "Adds the repo-root AGENTS.md expected by the cross-vendor AGENTS.md\nconvention (Codex CLI, Cursor, Copilot, Windsurf, Aider, Zed, Jules,\netc.), pointing agents at PROMQL-CODY.md and the six skills/<tool>/\nSKILL.md files, condensed build/test/lint commands, and how to\ninstall these skills via the Cla\n[…]\nr agentskills.io-compliant marketplaces (full detail in\nINSTALLING.md).\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KhqSSdtMaV2MRJaTWwNihy",
"is_bot": false,
"headline": "docs: add AGENTS.md for cross-tool AI coding agents",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-07-18T14:08:00Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "51fd7821e0f942fb7549424e1a55baae2de879cd",
"body": "…jq5m\n\nci: make goreleaser-check advisory instead of blocking",
"is_bot": false,
"headline": "Merge pull request #25 from conallob/claude/skills-md-coding-agent-td…",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-07-18T14:05:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "69743537538a118b311a3abc69ea0c75c5cdb72e",
"body": "goreleaser check hard-fails (exit 2) on deprecated-but-functional\nconfig (dockers/docker_manifests/brews), even though `goreleaser\nrelease`/`build` only warn on the same properties and complete\nsuccessfully — verified locally with `goreleaser build --snapshot`\nagainst v2.17.0 (same version CI pins).\n[…]\nover a\ncheck that's stricter than the tool doing the real release work.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KhqSSdtMaV2MRJaTWwNihy",
"is_bot": false,
"headline": "ci: make goreleaser-check advisory instead of blocking",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-07-18T13:56:52Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "4225c96f311f791865d45a3375ca1b83659e9eb7",
"body": "…jq5m\n\ndocs: add PROMQL-CODY.md, per-tool Agent Skills, and marketplace install docs",
"is_bot": false,
"headline": "Merge pull request #24 from conallob/claude/skills-md-coding-agent-td…",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-07-18T13:29:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c9015fe17425afa66d8236340770b6e7e02b4a98",
"body": "test.yml had no path filtering, so editing only Markdown skill docs\nstill ran the full Go build/test/lint/goreleaser-check matrix. Add\npaths-ignore for **.md, skills/**, and .claude-plugin/** to both\ntriggers so docs-only PRs don't pay for (or get blocked by) Go CI\nthat has nothing to check.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KhqSSdtMaV2MRJaTWwNihy",
"is_bot": false,
"headline": "ci: skip Go test/lint/goreleaser jobs for docs-only changes",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-07-18T13:28:50Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "998921d2a6789b4179776e00436e89d43a536c18",
"body": "…l hermeticity\n\nExplain how to make the ephemeral Alertmanager fully hermetic in CI:\nkeep the team's real routing/grouping/inhibition rules but override\nevery receiver's connection details with local no-op values, so real\nrouting logic is exercised but no notification ever leaves the runner.\nUpdate PROMQL-CODY.md's tool classification and workflow to match.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KhqSSdtMaV2MRJaTWwNihy",
"is_bot": false,
"headline": "docs(e2e-alertmanager-test): document skeleton-config pattern for ful…",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-07-18T11:48:46Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "922b02c42b69cf6533fd95370a683f5c7ce77f72",
"body": null,
"is_bot": false,
"headline": "Tweak the dedication ever so slightly",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-07-18T11:43:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a22cc982772e57a678234cf22d910f9865d6d7a4",
"body": "Add an in-memoriam note linking to https://supah.green. A further\nlink explaining the connection to PromQL best practices will follow.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KhqSSdtMaV2MRJaTWwNihy",
"is_bot": false,
"headline": "docs: dedicate PromQL-Cody to the late Cody Smith",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-07-17T17:25:10Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "04c5a1d1e6b5d457b4c6906a5255f27ff6e56fa4",
"body": "…t marketplaces\n\nAdds INSTALLING.md covering three install paths: local copy into a\nskills directory (works with any agentskills.io-compliant agent), the\nClaude Code plugin marketplace, and community/official marketplace\nlistings. Ships a validated .claude-plugin/marketplace.json so\n`/plugin marketp\n[…]\nthat support the open Agent Skills standard (OpenAI Codex CLI, Cursor).\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KhqSSdtMaV2MRJaTWwNihy",
"is_bot": false,
"headline": "docs: add install instructions for the PromQL-Cody skills across agen…",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-07-17T17:22:00Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "59976776f4869c6f8ef97f35581ddc045292c2c9",
"body": "Rebrand the top-level cross-tool Agent Skill as PromQL-Cody.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KhqSSdtMaV2MRJaTWwNihy",
"is_bot": false,
"headline": "docs: rename unified skill doc to PROMQL-CODY.md",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-07-17T16:52:33Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e1a87abd90ef8f576b0b6bc00af27c5be6db411b",
"body": "Adds a top-level SKILLS.md indexing the six CLI tools by hermeticity and\nrecommended workflow placement, plus six standalone skills/<tool>/SKILL.md\nfiles (YAML frontmatter + usage instructions) so each tool's usage can be\npublished and consumed independently on Agent Skills marketplaces.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KhqSSdtMaV2MRJaTWwNihy",
"is_bot": false,
"headline": "docs: add SKILLS.md and per-tool Agent Skills for coding agents",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-07-17T16:45:29Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "f01f5be286187bc7964779891cbbef9ce0c40870",
"body": "…s-k9xka8\n\ndocs: remove Go Report Card badge from README",
"is_bot": false,
"headline": "Merge pull request #23 from conallob/claude/goreportcard-badge-update…",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-07-15T09:05:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cfffecaa4452c8c669a5357cf6822e0d1784a6eb",
"body": null,
"is_bot": false,
"headline": "docs: remove Go Report Card badge from README",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-07-15T01:51:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "52f9ca6bef279db778365f97d983936b8910851f",
"body": "test: improve coverage to 97%+ across core packages",
"is_bot": false,
"headline": "Merge pull request #22 from conallob/claude/improve-coverage-further",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-05-16T22:53:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "359eef55540759821f0b4b75053ee8844b172512",
"body": "- internal/promql: 100% (added TestGenerateSuggestionNoMatch for early-return branch)\n- pkg/formatting: 97.1% (added tests for double/single-quoted expr, sparse metrics,\n httptest-backed Prometheus URL paths, formatOperand prefix style, binary op split)\n- internal/alertmanager: 94.2% (added httptes\n[…]\ntHistory/FindLastFiredTimes\n tests, error-path tests for Load/Update/GetNames/Delete, percentile boundary and\n fallback duration-parse tests)\n\nhttps://claude.ai/code/session_01MxQQuFxQeKfrMvkBVof1mx",
"is_bot": false,
"headline": "test: improve coverage to 97%+ across core packages",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-05-16T22:51:53Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c3dc2a82636a0daeee3362ea88834e4e273501d5",
"body": null,
"is_bot": false,
"headline": "Merge pull request #21 from conallob/claude/improve-test-coverage",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-05-16T22:17:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d9fb525f816901156a1caa93e2f889e9d4647e42",
"body": "Add codecov.yml to exclude cmd/* packages from coverage reporting.\nThese are thin CLI entry points with no testable business logic; they\ndrag the overall percentage down from ~90% to 38% without reflecting\nreal quality gaps.\n\nAdd tests for internal/alertmanager to bring it from 51.6% to 93.8%:\n- Fet\n[…]\n paths for LoadAlertDurations, UpdateAlertDurations,\n GetAlertNamesFromRules, DeleteAlertsFromRules (missing file and\n invalid YAML branches)\n\nhttps://claude.ai/code/session_01MxQQuFxQeKfrMvkBVof1mx",
"is_bot": false,
"headline": "feat(coverage): exclude cmd/ from Codecov and add alertmanager tests",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-05-16T19:49:12Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c913a05e4807043a62bcaf21ba8260972d2eaac7",
"body": "…decov",
"is_bot": false,
"headline": "Merge pull request #20 from conallob/claude/fix-ci-go-versions-and-co…",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-05-16T19:43:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7e4052ea65579465848d02edc42d9cd5bb444e14",
"body": "GOTOOLCHAIN=go1.25+auto (without patch version) causes 'go mod download'\nto fail because Go can't resolve 'go1.25' as an exact toolchain name.\nUsing GOTOOLCHAIN=local tells Go to use the toolchain installed by\nsetup-go and never attempt auto-downloads, which is the correct\nbehaviour for a CI matrix.\n\nhttps://claude.ai/code/session_01MxQQuFxQeKfrMvkBVof1mx",
"is_bot": false,
"headline": "fix(ci): use GOTOOLCHAIN=local to prevent toolchain resolution failures",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-05-16T14:04:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "795565b0de8dc34ae6342e15279df5772a2e2e1e",
"body": "- Update test matrix from Go 1.21/1.22 to 1.24/1.25, matching the\n go.mod minimum of 1.24.7 (testing older versions was misleading as\n Go's toolchain management would auto-upgrade them anyway)\n- Add 'Configure toolchain' step (GOTOOLCHAIN=go${{ matrix.go }}+auto)\n to pin each matrix run to its de\n[…]\npload on latest matrix Go (1.25) instead of all versions\n- Update goreleaser-check to use go-version-file: go.mod instead of\n hardcoded '1.21'\n\nhttps://claude.ai/code/session_01MxQQuFxQeKfrMvkBVof1mx",
"is_bot": false,
"headline": "fix(ci): update Go versions, Codecov action, and toolchain pinning",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-05-16T14:02:36Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "792be7590856948c4a628384d350f3788502c3a0",
"body": "chore: upload coverage on all ubuntu-latest runs",
"is_bot": false,
"headline": "Merge pull request #19 from conallob/claude/fix-codecov-go-version-taUGe",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-05-15T23:45:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "698a3511beba1c0061fa1d2c9dc079ae9b80c0ef",
"body": "Using 'go-version: stable' causes golangci-lint to exit with code 2\nwhen the stable Go version is newer than the go.mod minimum (1.24.7).\nSwitching to 'go-version-file: go.mod' ensures the lint environment\nmatches the declared minimum and avoids typecheck failures.\n\nhttps://claude.ai/code/session_01MxQQuFxQeKfrMvkBVof1mx",
"is_bot": false,
"headline": "fix: pin lint job Go version to go.mod instead of stable",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-05-15T23:22:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "72a958a727dd673b641e9bec828a64ac2d27ae38",
"body": "My previous 'fix' (checkout@v4, setup-go@v5, golangci-lint-action@v6)\nwas wrong. Those are older versions; @v6 of the lint action doesn't\nsupport golangci-lint v2. Restore the original versions which are all\nvalid and current: checkout@v5, setup-go@v6, golangci-lint-action@v9.\n\nhttps://claude.ai/code/session_01MxQQuFxQeKfrMvkBVof1mx",
"is_bot": false,
"headline": "revert: restore original golangci-lint action versions",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-05-15T23:20:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "304a2c551f80da4b9b8346ddd296fe5727e2ba17",
"body": "checkout@v5, setup-go@v6, and golangci-lint-action@v9 don't exist.\nAlign with versions used by the rest of the workflow (checkout@v4,\nsetup-go@v5) and use golangci-lint-action@v6.\n\nhttps://claude.ai/code/session_01MxQQuFxQeKfrMvkBVof1mx",
"is_bot": false,
"headline": "fix: correct action versions in golangci lint job",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-05-15T23:10:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "37e45836cf329602505f75f2d8aaa2b5f91f0a7d",
"body": "The condition was pinned to matrix.go == '1.21', meaning coverage\nwould never upload when newer Go versions are added to the matrix.\nNow uploads on ubuntu-latest for every Go version tested.\n\nhttps://claude.ai/code/session_01MxQQuFxQeKfrMvkBVof1mx",
"is_bot": false,
"headline": "fix: relax Codecov upload condition to run on all Go versions",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-05-15T22:31:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b7b2172de880ecb164b9cbbd263601038e877cae",
"body": null,
"is_bot": false,
"headline": "Bump golang version badge to 1.24+",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-05-15T20:53:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3debdaab37922b2b00d3adadffa35883b008f807",
"body": "…eck-B6x8y\n\nAdd validation for utilization metrics divisor in PromQL",
"is_bot": false,
"headline": "Merge pull request #18 from conallob/claude/add-utilization-metric-ch…",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-01-26T23:54:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cf7731f79567bed465f181761c21f93e69e44e8c",
"body": "Add validation that ensures utilization metrics (metrics containing\n\"utilization\" in their name) are divided by a metric containing\n\"_total\" or \"total\" in the denominator. This enforces the best\npractice that utilization should be calculated as (used / total).\n\nThe check:\n- Detects division operatio\n[…]\n\"utilization\" and \"total\"\n- Skips non-division expressions and non-utilization metrics\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>\n\nhttps://claude.ai/code/session_01FzVGHVbzHrZyu8YmkB5N11",
"is_bot": false,
"headline": "feat(promql-fmt): add utilization metric divisor check",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-01-26T23:52:50Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "58a47024b04177afe969136147037a1c6a88c141",
"body": "…Vdi2\n\ndocs: document all 6 binaries and reorganize documentation",
"is_bot": false,
"headline": "Merge pull request #17 from conallob/claude/goreleaser-all-binaries-9…",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-01-26T23:46:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "81f1fd8bf30aa8956ae4c7b89da30b86fcc1eae8",
"body": "Updated README.md to document all 6 CLI tools and reorganized\ndocumentation into separate files for better maintainability.\n\nChanges to README.md:\n- Added documentation for 3 new tools:\n * autogen-promql-tests: PromQL test case generator\n * e2e-alertmanager-test: End-to-end Alertmanager testing\n \n[…]\n CI/CD integration info\n\nThis reorganization makes documentation easier to maintain and\nhelps contributors find relevant information quickly.\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: document all 6 binaries and reorganize documentation",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-01-23T15:42:15Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "218115665d4cb47c8d80e08071c825a135e8b29f",
"body": "…Vdi2\n\nfix(ci): correct Homebrew token environment variable name",
"is_bot": false,
"headline": "Merge pull request #16 from conallob/claude/goreleaser-all-binaries-9…",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-01-23T10:07:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9fced931f8c202e3b47be4853b453b8b3888d4aa",
"body": "Fixed mismatch between the environment variable name used in the\nrelease workflow and what GoReleaser expects.\n\nIssue:\n- .goreleaser.yml expects: HOMEBREW_TAP_GITHUB_TOKEN\n- release.yml was setting: HOMEBREW_TAP_TOKEN\n- GitHub secret is: HOMEBREW_TAP_GITHUB_TOKEN\n\nThis caused Homebrew formula publis\n[…]\niable.\n\nChanges:\n- Updated release.yml to set HOMEBREW_TAP_GITHUB_TOKEN instead of\n HOMEBREW_TAP_TOKEN to match what .goreleaser.yml expects\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(ci): correct Homebrew token environment variable name",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-01-23T10:06:05Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "c92eb4e27f6fa1023c115cbf0d0d529d621fe166",
"body": "…Vdi2",
"is_bot": false,
"headline": "Merge pull request #15 from conallob/claude/goreleaser-all-binaries-9…",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-01-23T01:35:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "11b9d82d9fc829d8ea87c51e72f05c956f81f086",
"body": "Updated documentation to include all 6 CLI tools instead of just the\noriginal 3, addressing PR feedback.\n\nChanges:\n- Overview section: Updated from \"three CLI tools\" to \"six CLI tools\"\n and added autogen-promql-tests, e2e-alertmanager-test, and\n stale-alerts-analyzer\n\n- Go Module Structure: Added \n[…]\ninaries\n\nThis ensures developers following CLAUDE.md will build and test all\nbinaries locally, preventing build failures for the newer tools.\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: update CLAUDE.md to reflect all 6 binaries",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-01-23T01:32:43Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "07801f3f6db92b3025521cdfbfe2bc4022186844",
"body": "Added automated validation to ensure .goreleaser.yml, cmd/ binaries,\nand Dockerfiles all stay in sync.\n\nChanges:\n- Created scripts/validate-goreleaser-consistency.sh that checks:\n * Every cmd/ binary has a build config in .goreleaser.yml\n * Every cmd/ binary has a Dockerfile\n * Every cmd/ binary \n[…]\nipt provides detailed error messages with exact YAML\nsnippets to add when inconsistencies are detected, making it easy to\nfix issues quickly.\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(ci): add comprehensive GoReleaser consistency validation",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-01-22T20:03:36Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "737eb8ef5fc7ad0e752f8c41093ff90a7a851642",
"body": "Extended GoReleaser configuration to build and release all 6 binaries\ninstead of just the original 3:\n\nAdded binaries:\n- autogen-promql-tests: PromQL test case generator\n- e2e-alertmanager-test: End-to-end Alertmanager testing tool\n- stale-alerts-analyzer: Alert staleness analyzer\n\nChanges:\n- Added \n[…]\n references\n\nAll binaries have corresponding Dockerfiles and are built for:\n- Platforms: linux, darwin, windows\n- Architectures: amd64, arm64\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(goreleaser): add support for all binaries in cmd/",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-01-22T19:09:58Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2fba36b724db233458cae5883d7e60b2a50839fe",
"body": null,
"is_bot": false,
"headline": "Delete ephemeral PR_DESCRIPTION.md",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-01-14T00:33:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3a0541efbcb7a4d8cfd29c37725c3f8e5880a191",
"body": "…at-fjUjc\n\ndocs: fix promql-fmt multiline formatting example",
"is_bot": false,
"headline": "Merge pull request #14 from conallob/claude/fix-promql-multiline-form…",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-01-14T00:30:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7054e4c56b4c9c9628c99f71e5ca77b708cede5f",
"body": "…ation details",
"is_bot": false,
"headline": "docs: add comprehensive PR description with all prompts and implement…",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-01-14T00:27:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7eb7658a9a3875e60691133308e6bc5dc78887e6",
"body": "Fix linting issues reported by golangci-lint:\n\n1. staticcheck QF1003: Convert if-else chain to tagged switch for\n character checking (line 312)\n\n2. unused: Remove 4 unused functions:\n - splitByOperators() - no longer needed after refactoring\n - splitKeepDelimiter() - helper for splitByOperator\n[…]\nnused after implementation changes\n - findCommonLabels() - unused after implementation changes\n\nAll tests pass with race detection enabled.\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(promql-fmt): resolve golangci-lint errors",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-01-14T00:25:56Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e298b82df0adcf893d8434f77f8aeae36dd7308c",
"body": "Add checks to detect and warn about ambiguous recording rule operation\nsuffixes ':value' and ':avg' in recording rule names.\n\nValidation rules:\n- ':value' suffix is discouraged for being ambiguous and redundant\n (all metrics have values by definition)\n- ':avg' alone is discouraged for being ambiguo\n[…]\n'avg' without time window (invalid)\n- Recording rule with 'avg5m' (valid)\n\nAll tests pass (17 test cases total for checkRecordingRuleNaming).\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(promql-fmt): add validation for ambiguous recording rule suffixes",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-01-13T22:56:55Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "37da6be252c4948743bcb7f9fcb01ad1a1bdb54f",
"body": "…dations\n\nImplement three new validation functions according to Prometheus naming\nbest practices (https://prometheus.io/docs/practices/naming/ and\nhttps://prometheus.io/docs/practices/rules/):\n\n1. checkVariableNaming():\n - Validates metric names match [a-zA-Z_:][a-zA-Z0-9_:]*\n - Enforces snake_c\n[…]\nrdingRuleNaming()\n\nAll validations integrated into checkPrometheusBestPractices() for\nautomatic checking during PromQL expression validation.\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(promql-fmt): add variable, label, and recording rule naming vali…",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-01-13T22:32:13Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "6e475e6dade0bdabbdea3b53d2112d9b353ce469",
"body": "Implement checkSyntheticMetrics() to validate that the synthetic 'up'\nmetric always includes a job label selector to avoid matching multiple\njobs erroneously in systems with more than one value for job.\n\nThe validation:\n- Detects 'up' metric usage in all contexts (standalone, aggregations,\n range s\n[…]\ntches 'up' followed by optional label selectors and valid\n boundary characters\n- Comprehensive test coverage for 9 different usage scenarios\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(promql-fmt): add validation for synthetic 'up' metric job label",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-01-13T19:53:21Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "eb0c95021a7462cae80b21541d66a058429dfd95",
"body": "Fix spacing in on() clause generation to match PromQL syntax conventions.\nChanged `on(instance)` to `on (instance)` with proper spacing.\n\nUpdated:\n- formatPromQLMultiline() to generate `on (label)` instead of `on(label)`\n- All test cases to reflect correct spacing\n- README example to show proper format\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(promql-fmt): add space between on and parenthesis in vector matching",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-01-13T19:47:23Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "d61a0ee7edad767b1ac64a2f8895717c18315cde",
"body": "Add automatic generation of on() clauses when formatting binary operations\nwith aggregations. This makes vector matching semantics explicit and improves\nquery readability.\n\nKey changes:\n- Extract matching labels from aggregation by() clauses\n- Generate on() clauses in operator line for explicit vect\n[…]\nes it explicit which labels are used for vector matching between\nthe two operands, following PromQL best practices for clear query semantics.\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(promql-fmt): add explicit on() clauses for vector matching clarity",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-01-13T18:26:05Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "fd1a40ff28ea1e56790155111b97961b513d1854",
"body": "…erations\n\nAdd automatic optimization to remove redundant aggregation clauses from\nthe left operand when both operands of a binary operation share the same\naggregation clause. This follows PromQL best practices where only the\nfinal operand needs the aggregation.\n\nKey changes:\n- Enhanced formatPromQL\n[…]\nby (instance)\n\nException: 'without' clauses are preserved on both operands as they\nneed to be explicit for correct label stripping semantics.\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(promql-fmt): optimize redundant aggregation clauses in binary op…",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-01-13T18:22:02Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a1a664ab996bd3e1826f3dce988f15e2c4d8bd89",
"body": "… operators\n\nImplement the correct multiline formatting for PromQL expressions as\ndocumented in the README:\n- Each operand expression on its own line\n- Binary operators (/, *, +, -, etc.) indented by 2 spaces on their own line\n- Support for nested expressions with proper indentation\n- Convert postfi\n[…]\n example\n\nFixes the implementation to match the documented behavior and removes\nthe \"complex multiline split not yet implemented\" limitation.\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(promql-fmt): implement proper multiline formatting with indented…",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-01-13T01:32:17Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b8a228e1412047fb0f97a2b2eab49941238d65b5",
"body": "Update the example to show the correct multiline format where:\n- Each operand expression is on its own line\n- The operator (/) is indented by 2 spaces between operands\n- Each operand can be a multiline expression with proper indentation\n\nThis makes the example consistent with the actual formatting behavior\nand best practices for complex PromQL expressions.\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: fix promql-fmt multiline formatting example",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-01-13T01:27:31Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "3bf6bc16616950a124c5acb505f7eccfcbb0d870",
"body": null,
"is_bot": false,
"headline": "Add a background section for why these tools",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-01-13T01:22:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "35771f885a0140cf831de7a359b05f935e79bef4",
"body": null,
"is_bot": false,
"headline": "Delete ephemeral PR_DESCRIPTION.md",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-01-12T23:58:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d18a4f76bef0afa7d91be7bb39a591aa684d5f8f",
"body": "…Mz23\n\nAdd Badges to README.md, fix license references",
"is_bot": false,
"headline": "Merge pull request #13 from conallob/claude/add-missing-dockerfiles-N…",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-01-12T23:58:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "24b8098609dc66071b682edb68d83bf8c08b15f6",
"body": null,
"is_bot": false,
"headline": "Create FUNDING.yml, with buymeacoffee",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-01-12T23:56:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c1774012686cea59b6fe39b3734cf5d6b06487a8",
"body": null,
"is_bot": false,
"headline": "Fix the homebrew-tap token name",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-01-12T23:48:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3fa310b09a7262c2067ecba0085fdb740d01969d",
"body": "Fixed license references in two places:\n- Badge in header (line 7)\n- License section (line 396)\n\nThe actual project license is BSD 3-Clause, not Apache 2.0.\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: correct license from Apache 2.0 to BSD 3-Clause in README",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-01-12T20:05:31Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "2b10edbb2698a8479306d5c1b3bb3bc43ad36133",
"body": "Added badges for:\n- GitHub Actions CI status\n- Go Report Card quality metrics\n- Codecov coverage\n- Go version compatibility (1.21+)\n- Apache 2.0 license\n- Buy Me a Coffee support link (@conallob)\n\nBadges provide at-a-glance project health and support information.\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: add project badges to README including Buy Me a Coffee",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-01-12T20:04:23Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "7a0e39cf129d96df323ed2b7a71c8d4d228b32ed",
"body": "…Mz23\n\nfeat: add missing Dockerfiles and CI check for Dockerfile consistency",
"is_bot": false,
"headline": "Merge pull request #12 from conallob/claude/add-missing-dockerfiles-N…",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-01-12T15:04:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "77f111ff57df40da88e868d6e70f080401e9cdf8",
"body": "Added Dockerfiles for the three remaining tools that were missing them:\n- Dockerfile.autogen-promql-tests\n- Dockerfile.e2e-alertmanager-test\n- Dockerfile.stale-alerts-analyzer\n\nPreviously only 3 of 6 cmd/ tools had corresponding Dockerfiles. Now all 6 tools have their own Dockerfiles following the s\n[…]\nry under cmd/, a corresponding Dockerfile.<tool-name> exists. This prevents future discrepancies between the number of tools and Dockerfiles.\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: add missing Dockerfiles and CI check for Dockerfile consistency",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-01-12T14:53:31Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "aa1df279a140b3c345f2b5388c988666b5660906",
"body": "Add PromQL alert rule validation checks",
"is_bot": false,
"headline": "Merge pull request #11 from conallob/claude/add-promql-validation-pxshq",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-01-12T14:46:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "225f51f2ad0973991b14ea834e2f4f1386f62d27",
"body": "This commit addresses three issues raised in PR feedback:\n\n1. Fixed defer closure with named return values (Issue #1)\n - Changed checkMetricContinuity signature to use named return values\n - Deferred error handling now correctly propagates resp.Body.Close() errors\n - Location: pkg/formatting/p\n[…]\n go test -v -race ./...\n- No linting issues: golangci-lint run (0 issues)\n- Test coverage includes happy path, edge cases, and error handling\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: address PR feedback for promql-fmt validation checks",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-01-12T14:35:01Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b7af8646311f25aa789c5e250a1db001389f2417",
"body": "Add two new validation checks to promql-fmt:\n\n1. Alert Hysteresis with Duration Check:\n - Detects alert rules that have both a 'for' clause (hysteresis) and\n duration(s) in the PromQL expression (e.g., [15m])\n - Warns that the duration should be removed as the sliding window\n interacts p\n[…]\n checkTimeseriesContinuity() and checkMetricContinuity()\n- Added comprehensive unit tests for both checks\n- All tests pass, no linting issues\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(promql-fmt): add hysteresis and timeseries continuity checks",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-01-12T11:55:22Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "626f7c392a3e060c25ccb369fce7fca0f2c01417",
"body": "…BNb2s",
"is_bot": false,
"headline": "Merge pull request #10 from conallob/claude/fix-hysteresis-data-loss-…",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-01-12T01:33:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9a1bdcc6a5c1a7920d67aa0db16f94a4e3d429ce",
"body": "…add missing tests\n\nFixes two critical issues identified in post-merge PR feedback:\n\nIssue 1: Data Loss in UpdateAlertDurations\n- PrometheusRuleGroup struct was incomplete, only capturing alert and for fields\n- When YAML was unmarshaled and marshaled back, critical fields were lost:\n * expr (PromQL\n[…]\ntions are preserved\n- group interval is preserved\n- recording rules are preserved\n\nThis ensures the data loss bug is fixed and won't regress.\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(alert-hysteresis): prevent data loss in UpdateAlertDurations and …",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-01-11T02:46:33Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "366790b3f4333fe67e1e7c4b6fb27e4405a28658",
"body": "fix: use correct secret name for Homebrew tap token",
"is_bot": false,
"headline": "Merge pull request #9 from conallob/claude/promql-test-tools-BNb2s",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-01-11T02:37:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7862cee175b3e636aaa181bc1896297c68761302",
"body": "The secret is named HOMEBREW_TAP_GITHUB_TOKEN, not HOMEBREW_TAP_TOKEN.\nThis was causing 401 authentication errors when GoReleaser tried to\npublish the Homebrew formula.\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: use correct secret name for Homebrew tap token",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-01-11T02:28:04Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "d99d4b90ed25ac6bfb2d2311c81675a294ac605b",
"body": "Add PromQL test automation and E2E alertmanager testing tools",
"is_bot": false,
"headline": "Merge pull request #8 from conallob/claude/promql-test-tools-BNb2s",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-01-11T02:19:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "670b7c1542fa648eb77be3848ede0cafdd6da326",
"body": "Added comprehensive PR description including:\n- Original prompts from user requests\n- Feature documentation for both CLI tools\n- Usage examples and implementation highlights\n- Complete test plan and benefits summary\n\nThis file can be used to create the PR via GitHub web interface\nsince gh CLI is not available in this environment.\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: add PR description template for GitHub web interface",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-01-10T15:31:04Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "a91d8199ea9da6d0a5a160c840dae0d6f4cf6387",
"body": "… UX development\n\nExpands e2e-alertmanager-test to render complete notification bodies in multiple\nformats, enabling UX development and visual diffing of alerting changes.\n\nNew Features:\n- HTML email rendering with severity-based color theming and responsive CSS\n- Slack message format with attachmen\n[…]\nlopers to preview and compare notification\nrendering across different platforms (email, Slack, webhooks) for better\nUX iteration and testing.\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(e2e-alertmanager-test): add full notification body rendering for…",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-01-10T15:07:35Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0361ae3213e71726d29c9956b20000cbb22ba6c5",
"body": "Add two new CLI tools for PromQL test generation and end-to-end alertmanager testing:\n\n**autogen-promql-tests**:\n- Identifies alerts and rules without test coverage\n- Generates comprehensive unit tests with --fix flag\n- Test cases include:\n * True positive (alert should fire)\n * False positive/tru\n[…]\nor convenience\n\nTesting:\n- Both tools compile successfully\n- All existing tests pass with race detection\n- Zero linter issues (golangci-lint)\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: add autogen-promql-tests and e2e-alertmanager-test CLI tools",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-01-10T02:13:03Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "74386574fa2312fb8d25448fc161b79329301c0b",
"body": "fix: replace Podman setup with standard Docker buildx in release work…",
"is_bot": false,
"headline": "Merge pull request #7 from conallob/feat/promql-label-improvements",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-01-10T01:42:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "046389f0a1dc69cfcfdeffe03071912b60cad795",
"body": "…flow\n\nThe release workflow was failing with permission errors when trying to use\nDocker buildx with Podman as the backend:\n\n```\nERROR: failed to initialize builder podman-builder (podman-builder0):\npermission denied while trying to connect to the Docker daemon socket\n```\n\n**Root Cause:**\nThe workfl\n[…]\n free version\nwith buildx works reliably with standard Docker. Podman support would\nrequire GoReleaser Pro or migrating to dockers_v2 format.\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: replace Podman setup with standard Docker buildx in release work…",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-01-10T01:35:56Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "8d02ebacb586c5abe5cc96e2b0a5fd4478e1c1e3",
"body": "Create CLI tool to analyze stale alerts",
"is_bot": false,
"headline": "Merge pull request #6 from conallob/claude/stale-alerts-analyzer-BNb2s",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-01-10T01:00:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f93e2dd41599d0b437467df33cfebdf7c56bcfed",
"body": "Enhance promql-fmt and label-check with aggregation and alert validation",
"is_bot": false,
"headline": "Merge pull request #5 from conallob/feat/promql-label-improvements",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-01-10T00:59:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e4bdc14c2fbe91fe7abe9e0c4b5e477af052ae76",
"body": null,
"is_bot": false,
"headline": "Add io to the imports",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-01-10T00:57:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c83901557ea27fb78bfe34e619d5462518d1c4c8",
"body": null,
"is_bot": false,
"headline": "Replace os.ReadFile(os.Stdin.Name()) with io.ReadAll(os.Stdin)",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-01-10T00:57:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a2ab398ce4658c7d305f91726590fd1300a99842",
"body": null,
"is_bot": false,
"headline": "docs: add PR description with original prompts",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-01-09T21:24:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4d3ba1e382f97347dbebdcac252601c8d2b597c2",
"body": "… extended duration units\n\nEnhance the stale-alerts-analyzer CLI with better time configuration:\n\n- Rename --threshold flag to --timehorizon for clearer semantics\n- Add custom duration parser supporting extended units:\n - h: hours (standard Go)\n - m: minutes (standard Go)\n - s: seconds (standard \n[…]\n to use \"time horizon\" terminology\n\nExamples:\n --timehorizon=6M (6 months)\n --timehorizon=90d (90 days)\n --timehorizon=1y (1 year)\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(stale-alerts-analyzer): rename --threshold to --timehorizon with…",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-01-09T21:15:35Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "6c6c187054f031beb4336ae4e250a02775a230e6",
"body": null,
"is_bot": false,
"headline": "chore: add coverage.txt to .gitignore",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-01-09T21:08:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5b51a39c5ba2f0802166e823d636306e91a0a7ef",
"body": "…alidation\n\nThis commit introduces several improvements to both tools:\n\n**promql-fmt enhancements:**\n- Add detection of redundant aggregation clauses (e.g., `by (instance)` on both sides of binary operators)\n- Add validation that aggregation clauses appear only on the final operand\n- Enforces best p\n[…]\nlabel validation (3 test functions)\n- Coverage: pkg/formatting at 86.1%, internal/promql at 99.1%\n- All tests pass with race detector enabled\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: enhance promql-fmt and label-check with aggregation and alert v…",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-01-09T21:08:12Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "bfb17288f21943c9406ed0e046905116766b1ddf",
"body": "…e alerts\n\nAdd new stale-alerts-analyzer tool that:\n- Queries Prometheus to find when each alert last fired\n- Identifies alerts that haven't fired within a configurable threshold (default 12 months)\n- Reports stale alerts with detailed last-fired timestamps\n- Supports --fix flag to automatically del\n[…]\nles\n- Add comprehensive tests for new functionality\n\nBuild changes:\n- Update Makefile to build stale-alerts-analyzer alongside existing tools\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(stale-alerts-analyzer): add CLI tool to identify and delete stal…",
"author_name": "Claude",
"author_login": "claude",
"committed_at": "2026-01-09T21:07:51Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e88675761921b7ec9c73076409bf6f2de396b9b3",
"body": "[alert-hysteresis] add percentile analysis and fix mode with sensitivity context",
"is_bot": false,
"headline": "Merge pull request #4 from conallob/claude/enhance-alert-hysteresis",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-01-09T17:38:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "665c01f5fd3183c02db61f6737297d881cd37558",
"body": null,
"is_bot": false,
"headline": "Add a note about documenting major prompts in PR descriptions",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-01-09T17:37:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2751572c5d9bf2d2ec78bfde01f85539664d307f",
"body": null,
"is_bot": false,
"headline": "Delete coverage.txt, it's generated via CI workflows",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-01-09T17:33:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1f90e9cb306d37537357916dea1fcc955ac154f2",
"body": "Added clear explanation that hysteresis is analogous to \"hold down\" or\n\"hold up\" timers commonly used in networking. This helps users from\nnetworking backgrounds immediately understand the concept.\n\nChanges:\n- Updated package documentation in hysteresis.go with analogy\n- Enhanced CLI usage text to e\n[…]\nnetworking\nconcepts like BGP route flap dampening, interface hold timers, and\nother stability mechanisms that use similar hold-down patterns.\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(alert-hysteresis): explain hysteresis as hold down/hold up timers",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-01-09T17:29:16Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a21e09a0a876585a35bb3cbd51e33ae792f90fd6",
"body": "…lysis\n\nEnhanced the reasoning output to provide clearer context about the\ntrade-offs between different percentile thresholds:\n\n- Lower percentiles (< 0.25): \"very sensitive, may catch transient issues\"\n- Low percentiles (0.25-0.4): \"more sensitive, may catch transient issues\"\n- Balanced percentiles\n[…]\nrovide appropriate guidance.\n\nExample output:\n \"30.0% of alerts (3/10) fire for less than 5m0s (more sensitive, may catch transient issues)\"\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(alert-hysteresis): add sensitivity context to percentile ana…",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-01-09T17:28:35Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "abb0f8a2032a6c3c4512f77b79b8b615cbe98a8e",
"body": "Enhanced alert-hysteresis tool with comprehensive percentile reporting\nand automatic fix mode with configurable target percentiles.\n\nNew features:\n- Display 75th and 90th percentile durations in analysis output\n- Add --fix mode to automatically update rules files\n- Add --target-percentile flag (0-1)\n[…]\nsteresis --fix --rules=alerts.yml --target-percentile=0.25\n- Custom target: alert-hysteresis --fix --rules=alerts.yml --target-percentile=0.5\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(alert-hysteresis): add percentile analysis and fix mode",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-01-09T17:23:58Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "7b254a746087f16bc5e49365e49daed70fbc87af",
"body": "Add CLAUDE.md with repository guidance and CI auto-detection",
"is_bot": false,
"headline": "Merge pull request #3 from conallob/claude/add-claude-md",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-01-09T17:12:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6a7ea739119eca075e21427e83beda970361f6a8",
"body": "This file provides comprehensive guidance for Claude Code when working\nwith this repository, with emphasis on local CI check execution to\nminimize token usage and enable rapid iteration.\n\nKey sections:\n- Repository overview and architecture\n- CI/CD auto-detection and local execution workflow\n- Step-\n[…]\nds locally before committing\n3. Only push when all local checks pass\n\nThis prevents expensive CI failures and preserves conversation context.\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add CLAUDE.md with repository guidance and CI auto-detection",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-01-09T17:10:55Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2d901ff5495e5bc29ed07ea2cf833db8b4e0229a",
"body": "Create Multiple Static Analysis Tools for Maintaining Observability",
"is_bot": false,
"headline": "Merge pull request #1 from conallob/claude/promql-monitoring-tools-5HUx0",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-01-09T17:06:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dfb1bda763c625bd6c88b4fea551c1492e02e888",
"body": null,
"is_bot": false,
"headline": "Remove windows-latest from matrix.os",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-01-09T17:03:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "67a7eac39f13f5dc618079b0072b0d15554dedcc",
"body": "Podman support (use: podman) requires GoReleaser Pro. Changed to use\nbuildx which is available in the free version.\n\nChanges:\n- Replace use: podman with use: buildx in dockers section\n- Remove use: podman from docker_manifests section\n- Fix archives.format_overrides.format -> formats deprecation\n- C\n[…]\nr compatibility\n\nThe buildx builder will use Podman as the underlying container engine\nvia the /var/run/docker.sock symlink to Podman socket.\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Use Docker buildx instead of Podman in GoReleaser config",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-01-09T17:00:01Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2b9c571e5d8baac12f6b5ba981883873646538a8",
"body": "- Change archives.overrides to format_overrides\n- Revert from dockers_v2 back to dockers (v2 doesn't support Podman)\n- Revert from homebrew back to brews (correct for CLI tools)\n- Keep use: podman in dockers and docker_manifests sections\n- Use deprecated fields that still work since they support Pod\n[…]\ne: dockers_v2 only supports Docker buildx, not Podman.\nUsing deprecated dockers/docker_manifests until Podman support\nis added to dockers_v2.\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix GoReleaser v2 config field name errors",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-01-09T16:54:37Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "9c69a4506e12b233f8bd4eb28662b58c80fdd03e",
"body": null,
"is_bot": false,
"headline": "Fix erroneous indentation",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-01-09T16:50:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3cc82b6be12af09a5073fc15552c3a985efee31d",
"body": "GoReleaser v2 deprecation fixes:\n- Change archives.format to archives.formats (array)\n- Change archives.format_overrides to archives.overrides\n- Change snapshot.name_template to snapshot.version_template\n- Migrate from dockers/docker_manifests to dockers_v2\n- Migrate from brews to homebrew\n\nDocker t\n[…]\nar/run/docker.sock for Docker compatibility\n- Replace docker login with podman login\n- Update release footer documentation to use podman pull\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Migrate GoReleaser to v2 format and replace Docker with Podman",
"author_name": "Conall O'Brien",
"author_login": "conallob",
"committed_at": "2026-01-09T16:46:22Z",
"body_truncated": true,
"is_coding_agent": true
}
],
"releases_count": 10,
"commits_last_year": 115,
"latest_release_at": "2026-07-18T13:30:39Z",
"latest_release_tag": "v0.0.10",
"releases_from_tags": false,
"days_since_last_push": 6,
"active_weeks_last_year": 7,
"days_since_latest_release": 9,
"mean_days_between_releases": 21.1
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": true,
"health_percentage": 57,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "github.com/conallob/o11y-analysis-tools",
"exists": true,
"license": null,
"keywords": [],
"ecosystem": "go",
"matches_repo": true,
"registry_url": "https://pkg.go.dev/github.com/conallob/o11y-analysis-tools",
"is_deprecated": false,
"latest_version": "v0.0.10",
"repository_url": "https://github.com/conallob/o11y-analysis-tools",
"versions_count": 10,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2026-07-18T13:29:43Z",
"latest_version_yanked": null,
"days_since_latest_publish": 9
}
]
},
"popularity": {
"forks": 0,
"stars": 1,
"watchers": 1,
"fork_history": {
"days": [],
"complete": true,
"collected": 0,
"total_forks": 0
},
"star_history": null,
"open_issues_and_prs": 0
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [
"examples"
],
"has_llms_txt": false,
"has_dockerfile": true,
"has_mcp_signal": false,
"bootstrap_files": [
"Makefile"
],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [
"go.mod"
],
"largest_source_bytes": 45807,
"source_files_sampled": 12,
"oversized_source_files": 0,
"agent_instruction_files": [
"AGENTS.md",
"CLAUDE.md"
],
"agent_instruction_max_bytes": 16774
},
"dependencies": {
"manifests": [
"go.mod"
],
"advisories": {
"error": null,
"scope": "repository_graph",
"source": "osv",
"findings": [],
"collected": true,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 1,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"go"
],
"dependencies": [
{
"name": "gopkg.in/yaml.v3",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v3.0.1"
}
],
"all_dependencies": {
"error": null,
"source": "github-sbom",
"packages": [
{
"name": "gopkg.in/yaml.v3",
"direct": true,
"version": "v3.0.1",
"ecosystem": "go"
}
],
"collected": true,
"truncated": false,
"total_count": 1,
"direct_count": 1,
"indirect_count": 0
}
},
"maintainership": {
"issues": {
"open_prs": 0,
"merged_prs": 27,
"open_issues": 0,
"closed_ratio": null,
"closed_issues": 0,
"closed_unmerged_prs": 0
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "conallob",
"commits": 62,
"avatar_url": "https://avatars.githubusercontent.com/u/7395717?v=4"
},
{
"type": "User",
"login": "claude",
"commits": 53,
"avatar_url": "https://avatars.githubusercontent.com/u/81847?v=4"
}
],
"contributors_sampled": 2,
"top_contributor_share": 0.539
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"claude-code-review.yml",
"claude.yml",
"release.yml",
"test.yml"
],
"has_docs_dir": false,
"linter_configs": [
".golangci.yml"
],
"has_editorconfig": false,
"has_linter_config": true,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [
"go.sum"
],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": 0,
"reason": "branch protection not enabled on development/release branches",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": 10,
"reason": "9 out of 9 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/10 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 10,
"reason": "project has 3 contributing companies or organizations -- score normalized to 10",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": 10,
"reason": "no dangerous workflow patterns detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 0,
"reason": "no update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 10,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 10,
"reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": 10,
"reason": "packaging workflow detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": 0,
"reason": "dependency not pinned by hash detected -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "SAST tool is not run on all commits -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 0,
"reason": "security policy file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": 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": "b5106be06b3bf9deb620e7d7c01061d6ba4de5fc",
"ran_at": "2026-07-27T22:34:37Z",
"aggregate_score": 4.3,
"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-21T16:10:01Z",
"oldest_open_prs": [],
"last_merged_pr_at": "2026-07-21T16:07:08Z",
"ci_last_conclusion": null,
"oldest_open_issues": []
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/conallob/o11y-analysis-tools",
"host": "github.com",
"name": "o11y-analysis-tools",
"owner": "conallob"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 61,
"inputs": {
"security": 54,
"vitality": 77,
"community": 33,
"governance": 61,
"engineering": 74
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "good",
"name": "Vitality",
"value": 77,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "moderate",
"name": "Development activity",
"note": null,
"notes": [],
"value": 69,
"inputs": {
"commits_last_year": 115,
"human_commit_share": 1,
"days_since_last_push": 6,
"active_weeks_last_year": 7
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 6 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 6
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "7/52 weeks with commits",
"points": 4.8,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 7
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "115 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 115
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "excellent",
"name": "Release discipline",
"note": null,
"notes": [],
"value": 90,
"inputs": {
"releases_count": 10,
"latest_release_tag": "v0.0.10",
"releases_from_tags": false,
"days_since_latest_release": 9,
"mean_days_between_releases": 21.1
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "10 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 10
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 9 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 9
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~21.1 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 21.1
}
}
],
"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": "maintained",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": null,
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": 6,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "last human commit 6 days ago",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_maintained",
"params": {
"days": 6
}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "at_risk",
"name": "Community & Adoption",
"value": 33,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 1,
"inputs": {
"forks": 0,
"stars": 1,
"watchers": 1,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "1 stars",
"points": 0,
"status": "missed",
"details": [
{
"code": "stars",
"params": {
"count": 1
}
}
],
"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": "1 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 1
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "good",
"name": "Community health",
"note": null,
"notes": [],
"value": 70,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": true,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "recognized license (BSD-3-Clause)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "BSD-3-Clause"
}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 18,
"status": "met",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "moderate",
"name": "Sustainability & Governance",
"value": 61,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "at_risk",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 32,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 2,
"top_contributor_share": 0.539
},
"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 54% of commits",
"points": 10.4,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 54
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "2 contributors",
"points": 2.7,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 2
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 3 contributing companies or organizations -- score normalized to 10",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "good",
"name": "Issue & PR responsiveness",
"note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"issue_resolution"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 72,
"inputs": {
"merged_prs": 27,
"open_issues": 0,
"closed_issues": 0,
"issue_closed_ratio": null,
"closed_unmerged_prs": 0
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "no issues or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_issues_or_data",
"params": {}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "27/27 decided PRs merged",
"points": 38.2,
"status": "met",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 27,
"decided": 27
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/10 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "moderate",
"name": "Ownership & stewardship",
"note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"verified_domain"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 54,
"inputs": {
"followers": 12,
"owner_type": "User",
"is_verified": null,
"owner_login": "conallob",
"public_repos": 76,
"account_age_days": 4477
},
"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": "12 followers of conallob",
"points": 8,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 12,
"login": "conallob"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "76 public repos, account ~12 yr old",
"points": 25,
"status": "met",
"details": [
{
"code": "public_repos",
"params": {
"count": 76
}
},
{
"code": "account_age_years",
"params": {
"years": 12
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"github.com/conallob/o11y-analysis-tools"
],
"ecosystems": "go",
"any_deprecated": false,
"min_days_since_publish": 9
},
"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 9 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 9
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "10 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 10
}
}
],
"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": 74,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "good",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 84,
"inputs": {
"has_ci": true,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": true,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": "4 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 4
}
}
],
"max_points": 24
},
{
"key": "tests_present",
"name": "Tests present",
"detail": null,
"points": 24,
"status": "met",
"details": [],
"max_points": 24
},
{
"key": "linter_config",
"name": "Linter config",
"detail": ".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": "9 out of 9 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": 60,
"inputs": {
"topics": [
"ci",
"linter",
"prometheus",
"promql",
"testing-tools",
"static-analysis",
"conall-portfolio",
"observability",
"site-reliability-engineering",
"sre",
"agent-skills"
],
"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": "11 topics",
"points": 10,
"status": "met",
"details": [
{
"code": "topics_count",
"params": {
"count": 11
}
}
],
"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": "moderate",
"name": "Security",
"value": 54,
"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 not enabled on development/release branches",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "9 out of 9 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/10 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 3 contributing companies or organizations -- score normalized to 10",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "no update tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow detected",
"points": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "SAST tool is not run on all commits -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "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": "dependency_advisories",
"band": "excellent",
"name": "Dependency advisories",
"note": "Excluded from scoring (no data or not applicable): Indirect dependencies free of known advisories, No advisories left outstanding. Remaining weights renormalized. Matched 1 resolved dependencies against OSV. This repository publishes no package the index resolves, so the repository dependency graph was assessed instead. That graph mixes development and test pins with shipped dependencies, so only the declared runtime dependencies are scored; transitive findings are reported as context and excluded from the score. Reachability is not analyzed.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"indirect_dependencies_free_of_known_advisories",
"no_advisories_left_outstanding"
]
}
},
{
"code": "weights_renormalized",
"params": {}
},
{
"code": "advisories_scope_repository",
"params": {
"assessed": 1
}
},
{
"code": "advisories_repo_graph_caveat",
"params": {}
},
{
"code": "advisories_reachability",
"params": {}
}
],
"value": 100,
"inputs": {
"source": "osv",
"advisories": 0,
"affected_packages": 0,
"assessed_packages": 1,
"unassessed_packages": 0,
"affected_by_severity": "none",
"direct_affected_packages": 0
},
"components": [
{
"key": "direct_dependencies_free_of_known_advisories",
"name": "Direct dependencies free of known advisories",
"detail": "no direct dependency carries a known advisory",
"points": 35,
"status": "met",
"details": [
{
"code": "no_direct_advisories",
"params": {}
}
],
"max_points": 35
},
{
"key": "indirect_dependencies_free_of_known_advisories",
"name": "Indirect dependencies free of known advisories",
"detail": "transitive set not separable from development and test dependencies in this scope",
"points": 0,
"status": "excluded",
"details": [
{
"code": "advisories_scope_not_separable",
"params": {}
}
],
"max_points": 25
},
{
"key": "no_advisories_left_outstanding",
"name": "No advisories left outstanding",
"detail": "no advisory carries a publication date",
"points": 0,
"status": "excluded",
"details": [
{
"code": "advisories_no_publication_date",
"params": {}
}
],
"max_points": 40
}
]
},
{
"key": "malicious_dependencies",
"band": "excellent",
"name": "Malicious dependencies",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"source": "osv",
"meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
"packages": [],
"red_flag": false,
"assessed_packages": 1,
"malicious_packages": 0,
"direct_malicious_packages": 0,
"withdrawn_malicious_packages": 0,
"installable_malicious_packages": 0
},
"components": [
{
"key": "no_dependency_reported_as_a_malicious_package",
"name": "No dependency reported as a malicious package",
"detail": "no dependency is reported as a malicious package",
"points": 100,
"status": "met",
"details": [
{
"code": "no_malicious_dependencies",
"params": {}
}
],
"max_points": 100
}
]
},
{
"key": "high_risk_jurisdiction_exposure",
"band": "excellent",
"name": "High-Risk Jurisdiction Exposure",
"note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
"notes": [
{
"code": "jurisdiction_evidence_limits",
"params": {}
}
],
"value": 100,
"inputs": {
"meaning": "self-published location evidence; not nationality or citizenship",
"red_flag": false,
"exposures": [],
"policy_countries": [
"Russia",
"Iran",
"North Korea"
],
"review_only_matches": 0,
"assessed_self_published_locations": 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": 79,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "excellent",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 0.86,
"agent_instruction_files": [
"AGENTS.md",
"CLAUDE.md"
],
"agent_instruction_max_bytes": 16774
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "AGENTS.md, CLAUDE.md",
"points": 45,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "AGENTS.md, CLAUDE.md"
}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "86 of 100 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 86,
"sampled": 100
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "good",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 82,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [
"go.sum"
],
"has_dockerfile": true,
"typed_language": true,
"bootstrap_files": [
"Makefile"
],
"has_devcontainer": false,
"has_linter_config": true,
"typecheck_configs": [],
"agent_commit_share": 0.48,
"toolchain_manifests": [
"go.mod"
],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "Makefile",
"points": 18,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "Makefile"
}
}
],
"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": "Dockerfile, lockfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "Dockerfile, lockfile"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "48 of the last 100 commits agent-authored or agent-credited",
"points": 10,
"status": "met",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 48,
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "no automated dependency updates observed",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_dependency_automation",
"params": {}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "excellent",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"primary_language": "Go",
"largest_source_bytes": 45807,
"source_files_sampled": 12,
"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/12 source files over 60KB",
"points": 55,
"status": "met",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 12,
"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": [
"Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token"
],
"report_type": "repository",
"generated_at": "2026-07-27T22:34:52.737600Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/c/conallob/o11y-analysis-tools.svg",
"full_name": "conallob/o11y-analysis-tools",
"license_state": "standard",
"license_spdx": "BSD-3-Clause"
}