Public record
Software health reportschema 0.23.0 · metrics 1.13.0 · 2026-07-21 21:05 UTC

dynatrace-oss / dtctl

CLI for managing Dynatrace platform resources - built for humans and AI agents alike

GoApache-2.0★ 168 stars⑂ 58 forkssince Jan 2026View on GitHub ↗

dynatrace-oss/dtctl holds a health index of 77 out of 100, placing it in the Good band. It scores highest on Vitality (89/100) and lowest on Security (69/100). It was last updated today. A single contributor accounts for most of its recent work.

77
overall / 100
Good

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At risk ceiling of 49. AI Readiness sits outside the overall score.

77
Excellent85-100Exemplary; meets essentially all checked criteria
Good70-84Healthy; minor gaps
Moderate50-69Acceptable with notable gaps; review recommended
At risk30-49Significant weaknesses; adoption warrants caution
Critical1-29Severe problems (abandoned, single-maintainer, no hygiene)
VitalityCommunity &AdoptionSustainability &GovernanceEngineeringQualitySecurityAI Readiness

Score profile

Each axis is a category. The shape matters more than the average — a healthy subject fills the whole shape, while a spike-and-crater profile means strength in one dimension is masking risk in another.

Ownership

267 followers94 public repossince Nov 2019Dynatrace LLC

This repository is backed by an organization — shared, accountable stewardship that can outlive any single maintainer.

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publish
Gogithub.com/dynatrace-oss/dtctlv0.35.0-590 days ago
Gogithub.com/dynatrace-oss/dtctl/sdkv0.2.0-266 days ago

Metrics by category

Vitality

Is the project alive — is code being written and are releases shipping?

89Excellent · 22% of overall
How it's scored
36/36Push recency — last push 0 days ago
18.7/36Commit cadence — 27/52 weeks with commits
18/18Commit volume — 619 commits in the last year
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 15 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year619
human_commit_share0.79
days_since_last_push0
active_weeks_last_year27
How it's scored
27/27Ships releases — 59 releases published
36/36Release recency — latest release 0 days ago
27/27Release cadence — a release every ~3.9 days
8/10OpenSSF Scorecard: Signed-Releases — 5 out of the last 5 releases have a total of 5 signed artifacts.
Inputs used
releases_count59
latest_release_tagv0.35.0
releases_from_tagsno
days_since_latest_release0
mean_days_between_releases3.9

Community & Adoption

Does the project have users, downloads, attention, and a welcoming setup for contributors?

72Good · 18% of overall
How it's scored
36.1/60Stars — 168 stars
14.6/25Forks — 58 forks
3.9/15Watchers — 6 watchers
Inputs used
forks58
stars168
watchers6
growth_stateorganic
growth_factor_pct100

Community health

92Excellent
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (Apache-2.0)
18/18CONTRIBUTING guide
13.5/13.5Code of conduct
0/7.2Issue template
6.3/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingyes
has_issue_templateno
has_code_of_conductyes
has_pull_request_templateyes

Sustainability & Governance

Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?

69Moderate · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
7.7/22.5Commit distribution — top contributor authored 66% of commits
13.5/13.5Contributor breadth — 40 contributors
10/10OpenSSF Scorecard: Contributors — project has 8 contributing companies or organizations
Inputs used
bus_factor1
contributors_sampled40
top_contributor_share0.658
How it's scored
38/46.8Issue resolution — 81% of issues closed
34/38.3PR acceptance — 250/281 decided PRs merged
4.5/15OpenSSF Scorecard: Code-Review — Found 8/22 approved changesets -- score normalized to 3
Inputs used
merged_prs250
open_issues15
closed_issues65
issue_closed_ratio0.812
closed_unmerged_prs31
How it's scored
30/30Ownership backing — organization-owned
0/20Verified domain
17.5/25Owner reach — 267 followers of dynatrace-oss
25/25Track record — 94 public repos, account ~6 yr old
Inputs used
followers267
owner_typeOrganization
is_verified
owner_logindynatrace-oss
public_repos94
account_age_days2,430
How it's scored
25/25Published & resolvable — 2 package(s) on go
35/35Publish recency — latest publish 0 days ago
20/20Version history — 59 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packagesgithub.com/dynatrace-oss/dtctl, github.com/dynatrace-oss/dtctl/sdk
ecosystemsgo
any_deprecatedno
min_days_since_publish0

Engineering Quality

Are baseline engineering and documentation practices in place?

84Good · 20% of overall
How it's scored
24/24CI workflows — 9 workflow(s)
24/24Tests present
16/16Linter config — .golangci.yml
0/9.6Pre-commit hooks
0/6.4.editorconfig
16/20OpenSSF Scorecard: CI-Tests — 26 out of 29 merged PRs checked by a CI test -- score normalized to 8
Inputs used
has_ciyes
has_testsyes
has_editorconfigno
has_linter_configyes
has_precommit_configno

Documentation

90Excellent
How it's scored
30/30README
25/25Documentation directory
15/15Documentation / homepage site — https://dynatrace-oss.github.io/dtctl/
10/10Repository description
10/10Topics — 7 topics
0/10Wiki
Inputs used
topicscli, developer-tools, devops, dql, dynatrace, monitoring, observability
has_wikino
homepagehttps://dynatrace-oss.github.io/dtctl/
has_readmeyes
has_docs_diryes
has_descriptionyes

Security

Are visible security and supply-chain practices strong, without unresolved high-risk jurisdiction exposure?

69Moderate · 16% of overall
How it's scored
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — no data
2/2.5CI-Tests — 26 out of 29 merged PRs checked by a CI test -- score normalized to 8
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
2.2/7.5Code-Review — Found 8/22 approved changesets -- score normalized to 3
2.5/2.5Contributors — project has 8 contributing companies or organizations
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5License — license file detected
7.5/7.5Maintained — 30 commit(s) and 15 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
5/5Security-Policy — security policy file detected
6/7.5Signed-Releases — 5 out of the last 5 releases have a total of 5 signed artifacts.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
1.5/7.5Vulnerabilities — 8 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate6.1
Excluded from scoring (no data or not applicable): branch_protection. Remaining weights renormalized.
How it's scored
35/35Direct dependencies free of known advisories — no direct dependency carries a known advisory
0/25Indirect dependencies free of known advisories — transitive set not separable from development and test dependencies in this scope
0/40No advisories left outstanding — no advisory carries a publication date
Inputs used
sourceosv
advisories8
affected_packages4
assessed_packages151
unassessed_packages0
affected_by_severitycritical 1, high 2, unknown 1
direct_affected_packages0
Excluded from scoring (no data or not applicable): Indirect dependencies free of known advisories, No advisories left outstanding. Remaining weights renormalized. Matched 151 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.

AI Readiness

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.

82Good · 0% of overall
How it's scored
45/45Agent instructions — AGENTS.md, CLAUDE.md
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 78 of 79 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.987
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes17,569
How it's scored
18/18One-command bootstrap — makefile
22/22Automated tests
11/11Lint / format config — .golangci.yml
11/11Static type checking — Go (statically typed)
10/10Reproducible environment — devcontainer, Nix, lockfile
10/10Demonstrated agent practice — 16 of the last 100 commits agent-authored or agent-credited
8/8Automated maintenance — 16 of the last 100 commits are automated dependency updates
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Inputs used
has_nixyes
has_testsyes
lockfilesGemfile.lock, go.sum
has_dockerfileno
typed_languageyes
bootstrap_filesmakefile
has_devcontaineryes
has_linter_configyes
typecheck_configs
agent_commit_share0.16
toolchain_manifestsgo.mod, sdk/go.mod
dependency_bot_commit_share0.16
How it's scored
45/45Type-checkable code — Go (statically typed)
54.4/55Manageable file sizes — 6/580 source files over 60KB
Inputs used
primary_languageGo
largest_source_bytes112,576
source_files_sampled580
oversized_source_files6
How it's scored
0/40API schema (OpenAPI/GraphQL/proto)
0/20MCP server
40/40Runnable examples — examples
Inputs used
example_dirsexamples
has_mcp_signalno
api_schema_files

Key facts

168GitHub stars
40contributors
619commits, last 12 months
0days since last push
59releases
1bus factor
15open issues
Gopackage ecosystems

More detail

Star and fork history 168 ★ / 58 ⇿
168Stars
58Forks
58Releases

When each star and fork was added, collected from GitHub and bucketed by day. Cumulative growth sits directly above the daily additions it is made of, so the two read against each other: steady organic accretion looks nothing like an abrupt, short-lived burst. Where that difference is measurable, it is reported as growth authenticity.

0408012016020016858192026-012026-042026-07
Major 0Minor 32Patch 23
OpenSSF Scorecard 6.1 / 10
6.1aggregate

Independent, tool-agnostic security assessment from the open-source OpenSSF Scorecard. Each check rewards a security practice, not a specific vendor's tool. Checks Scorecard could not determine are marked n/a and excluded from the security score (never counted as zero).Scorecard v5.5.0 · 2026-07-21 21:05 UTC

10Binary-Artifactsno binaries found in the repo
n/aBranch-Protectioninternal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
8CI-Tests26 out of 29 merged PRs checked by a CI test -- score normalized to 8
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
3Code-ReviewFound 8/22 approved changesets -- score normalized to 3
10Contributorsproject has 8 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 15 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
10Security-Policysecurity policy file detected
8Signed-Releases5 out of the last 5 releases have a total of 5 signed artifacts.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
2Vulnerabilities8 existing vulnerabilities detected
Direct dependencies 30
RegistryPackageVersion constraintManifest
Gogithub.com/adrg/xdgv0.5.3go.mod
Gogithub.com/dynatrace-oss/dtctl/sdkv0.0.0-00010101000000-000000000000go.mod
Gogithub.com/go-resty/resty/v2v2.17.2go.mod
Gogithub.com/google/shlexv0.0.0-20191202100458-e7afc7fbc510go.mod
Gogithub.com/guptarohit/asciigraphv0.10.0go.mod
Gogithub.com/itchyny/gojqv0.12.19go.mod
Gogithub.com/olekukonko/tablewriterv1.1.4go.mod
Gogithub.com/parquet-go/parquet-gov0.30.1go.mod
Gogithub.com/spf13/cobrav1.10.2go.mod
Gogithub.com/spf13/pflagv1.0.10go.mod
Gogithub.com/spf13/viperv1.21.0go.mod
Gogithub.com/stretchr/testifyv1.11.1go.mod
Gogithub.com/toon-format/toon-gov0.0.0-20251202084852-7ca0e27c4e8cgo.mod
Gogo.opentelemetry.io/otelv1.44.0go.mod
Gogo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttpv1.44.0go.mod
Gogo.opentelemetry.io/otel/sdkv1.44.0go.mod
Gogo.opentelemetry.io/otel/tracev1.44.0go.mod
Gogolang.org/x/sysv0.47.0go.mod
Gogolang.org/x/termv0.45.0go.mod
Gogolang.org/x/textv0.40.0go.mod
Gogoogle.golang.org/protobufv1.36.11go.mod
Gogopkg.in/yaml.v3v3.0.1go.mod
Gogithub.com/adrg/xdgv0.5.3sdk/go.mod
Gogithub.com/go-resty/resty/v2v2.17.2sdk/go.mod
Gogithub.com/godbus/dbus/v5v5.2.2sdk/go.mod
Gogithub.com/pkg/browserv0.0.0-20240102092130-5ac0b6a4141csdk/go.mod
Gogithub.com/stretchr/testifyv1.11.1sdk/go.mod
Gogithub.com/zalando/go-keyringv0.2.8sdk/go.mod
Gogolang.org/x/sysv0.47.0sdk/go.mod
Gogopkg.in/yaml.v3v3.0.1sdk/go.mod
All dependencies 151

Full resolved dependency set from the GitHub dependency graph: 24 direct and 127 indirect (transitive) packages. The transitive closure is complete when the repository commits a lockfile.

RegistryPackageVersionRelation
Gogithub.com/adrg/xdgv0.5.3direct
Gogithub.com/go-resty/resty/v2v2.17.2direct
Gogithub.com/godbus/dbus/v5v5.2.2direct
Gogithub.com/google/shlexv0.0.0-20191202100458-e7afc7fbc510direct
Gogithub.com/guptarohit/asciigraphv0.10.0direct
Gogithub.com/itchyny/gojqv0.12.19direct
Gogithub.com/olekukonko/tablewriterv1.1.4direct
Gogithub.com/parquet-go/parquet-gov0.30.1direct
Gogithub.com/pkg/browserv0.0.0-20240102092130-5ac0b6a4141cdirect
Gogithub.com/spf13/cobrav1.10.2direct
Gogithub.com/spf13/pflagv1.0.10direct
Gogithub.com/spf13/viperv1.21.0direct
Gogithub.com/stretchr/testifyv1.11.1direct
Gogithub.com/toon-format/toon-gov0.0.0-20251202084852-7ca0e27c4e8cdirect
Gogithub.com/zalando/go-keyringv0.2.8direct
Gogo.opentelemetry.io/otelv1.44.0direct
Gogo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttpv1.44.0direct
Gogo.opentelemetry.io/otel/sdkv1.44.0direct
Gogo.opentelemetry.io/otel/tracev1.44.0direct
Gogolang.org/x/sysv0.47.0direct
Gogolang.org/x/termv0.45.0direct
Gogolang.org/x/textv0.40.0direct
Gogoogle.golang.org/protobufv1.36.11direct
Gogopkg.in/yaml.v3v3.0.1direct
Gogithub.com/andybalholm/brotliv1.1.1indirect
Gogithub.com/cenkalti/backoff/v5v5.0.3indirect
Gogithub.com/cespare/xxhash/v2v2.3.0indirect
Gogithub.com/clipperhouse/displaywidthv0.10.0indirect
Gogithub.com/clipperhouse/uax29/v2v2.6.0indirect
Gogithub.com/danieljoos/wincredv1.2.3indirect
Gogithub.com/davecgh/go-spewv1.1.2-0.20180830191138-d8f796af33ccindirect
Gogithub.com/fatih/colorv1.18.0indirect
Gogithub.com/fsnotify/fsnotifyv1.9.0indirect
Gogithub.com/go-logr/logrv1.4.3indirect
Gogithub.com/go-logr/stdrv1.2.2indirect
Gogithub.com/go-viper/mapstructure/v2v2.4.0indirect
Gogithub.com/google/uuidv1.6.0indirect
Gogithub.com/grpc-ecosystem/grpc-gateway/v2v2.29.0indirect
Gogithub.com/inconshreveable/mousetrapv1.1.0indirect
Gogithub.com/itchyny/timefmt-gov0.1.8indirect
Gogithub.com/klauspost/compressv1.17.9indirect
Gogithub.com/kr/prettyv0.3.1indirect
Gogithub.com/mattn/go-colorablev0.1.14indirect
Gogithub.com/mattn/go-isattyv0.0.20indirect
Gogithub.com/mattn/go-runewidthv0.0.19indirect
Gogithub.com/olekukonko/catv0.0.0-20250911104152-50322a0618f6indirect
Gogithub.com/olekukonko/errorsv1.2.0indirect
Gogithub.com/olekukonko/llv0.1.6indirect
Gogithub.com/parquet-go/bitpackv1.0.0indirect
Gogithub.com/parquet-go/jsonlitev1.0.0indirect
Gogithub.com/pelletier/go-toml/v2v2.2.4indirect
Gogithub.com/pierrec/lz4/v4v4.1.21indirect
Gogithub.com/pmezard/go-difflibv1.0.1-0.20181226105442-5d4384ee4fb2indirect
Gogithub.com/rogpeppe/go-internalv1.14.1indirect
Gogithub.com/sagikazarmark/locaferov0.11.0indirect
Gogithub.com/sourcegraph/concv0.3.1-0.20240121214520-5f936abd7ae8indirect
Gogithub.com/spf13/aferov1.15.0indirect
Gogithub.com/spf13/castv1.10.0indirect
Gogithub.com/subosito/gotenvv1.6.0indirect
Gogithub.com/twpayne/go-geomv1.6.1indirect
Gogo.opentelemetry.io/auto/sdkv1.2.1indirect
Gogo.opentelemetry.io/otel/exporters/otlp/otlptracev1.44.0indirect
Gogo.opentelemetry.io/otel/metricv1.44.0indirect
Gogo.opentelemetry.io/proto/otlpv1.10.0indirect
Gogo.yaml.in/yaml/v3v3.0.4indirect
Gogolang.org/x/netv0.55.0indirect
Gogoogle.golang.org/genproto/googleapis/apiv0.0.0-20260526163538-3dc84a4a5aaaindirect
Gogoogle.golang.org/genproto/googleapis/rpcv0.0.0-20260526163538-3dc84a4a5aaaindirect
Gogoogle.golang.org/grpcv1.81.1indirect
Gogopkg.in/check.v1v1.0.0-20201130134442-10cb98267c6cindirect
RubyGemsactivesupport4.2.9indirect
RubyGemsaddressable2.9.0indirect
RubyGemscoffee-script2.4.1indirect
RubyGemscoffee-script-source1.11.1indirect
RubyGemscolorator1.1.0indirect
RubyGemsconcurrent-ruby1.3.7indirect
RubyGemsethon0.18.0indirect
RubyGemsexecjs2.10.1indirect
RubyGemsfaraday2.14.3indirect
RubyGemsfaraday-net_http3.4.4indirect
RubyGemsffi1.17.4indirect
RubyGemsforwardable-extended2.6.0indirect
RubyGemsgemoji3.0.1indirect
RubyGemsgithub-pages170indirect
RubyGemsgithub-pages-health-check1.3.5indirect
RubyGemshtml-pipeline2.14.3indirect
RubyGemsi18n0.9.5indirect
RubyGemsjekyll3.6.2indirect
RubyGemsjekyll-avatar0.5.0indirect
RubyGemsjekyll-coffeescript1.0.2indirect
RubyGemsjekyll-default-layout0.1.4indirect
RubyGemsjekyll-feed0.9.2indirect
RubyGemsjekyll-gist1.4.1indirect
RubyGemsjekyll-github-metadata2.9.3indirect
RubyGemsjekyll-mentions1.2.0indirect
RubyGemsjekyll-optional-front-matter0.3.0indirect
RubyGemsjekyll-paginate1.1.0indirect
RubyGemsjekyll-readme-index0.2.0indirect
RubyGemsjekyll-redirect-from0.12.1indirect
RubyGemsjekyll-relative-links0.5.2indirect
RubyGemsjekyll-remote-theme0.5.1indirect
RubyGemsjekyll-sass-converter1.5.0indirect
RubyGemsjekyll-seo-tag2.3.0indirect
RubyGemsjekyll-sitemap1.1.1indirect
RubyGemsjekyll-swiss0.4.0indirect
RubyGemsjekyll-theme-architect0.1.0indirect
RubyGemsjekyll-theme-cayman0.1.0indirect
RubyGemsjekyll-theme-dinky0.1.0indirect
RubyGemsjekyll-theme-hacker0.1.0indirect
RubyGemsjekyll-theme-leap-day0.1.0indirect
RubyGemsjekyll-theme-merlot0.1.0indirect
RubyGemsjekyll-theme-midnight0.1.0indirect
RubyGemsjekyll-theme-minimal0.1.0indirect
RubyGemsjekyll-theme-modernist0.1.0indirect
RubyGemsjekyll-theme-primer0.5.2indirect
RubyGemsjekyll-theme-slate0.1.0indirect
RubyGemsjekyll-theme-tactile0.1.0indirect
RubyGemsjekyll-theme-time-machine0.1.0indirect
RubyGemsjekyll-titles-from-headings0.5.0indirect
RubyGemsjekyll-watch1.5.1indirect
RubyGemsjemoji0.8.1indirect
RubyGemsjson2.20.0indirect
RubyGemskramdown1.14.0indirect
RubyGemsliquid4.0.0indirect
RubyGemslisten3.0.6indirect
RubyGemslogger1.7.0indirect
RubyGemsmercenary0.3.6indirect
RubyGemsminima2.1.1indirect
RubyGemsminitest5.27.0indirect
RubyGemsnet-dns0.20.0indirect
RubyGemsnet-http0.9.1indirect
RubyGemsnokogiri1.19.4indirect
RubyGemsoctokit4.25.1indirect
RubyGemsopenssl4.0.2indirect
RubyGemspathutil0.16.2indirect
RubyGemspublic_suffix2.0.5indirect
RubyGemsracc1.8.1indirect
RubyGemsrb-fsevent0.11.2indirect
RubyGemsrb-inotify0.11.1indirect
RubyGemsrouge2.2.1indirect
RubyGemsrubyzip2.4.1indirect
RubyGemssafe_yaml1.0.5indirect
RubyGemssass3.7.4indirect
RubyGemssass-listen4.0.0indirect
RubyGemssawyer0.9.3indirect
RubyGemsterminal-table1.8.0indirect
RubyGemsthread_safe0.3.6indirect
RubyGemstyphoeus0.8.0indirect
RubyGemstzinfo1.2.11indirect
RubyGemsunicode-display_width1.8.0indirect
RubyGemsuri1.1.1indirect
Dependency advisories 4

This repository publishes no package the index resolves, so its own dependency graph was assessed — 151 packages, which also include development and test pins that never ship: 4 carry known advisories, of which 0 are direct.

PackageVersionRelationSeverityAdvisoriesFixed in
kramdown1.14.0indirectcritical12.3.0
activesupport4.2.9indirecthigh58.1.2.1
jekyll3.6.2indirecthigh13.8.4
golang.org/x/netv0.55.0indirectunknown10.56.0

An advisory means the version recorded in the dependency graph falls inside an advisory’s affected range. Reachability is not analysed, and the graph includes development and test pins — a finding may concern tooling rather than shipped software.

Raw JSON report machine-readable
{
  "data": {
    "repo": {
      "topics": [
        "cli",
        "developer-tools",
        "devops",
        "dql",
        "dynatrace",
        "monitoring",
        "observability"
      ],
      "is_fork": false,
      "size_kb": 9741,
      "has_wiki": false,
      "homepage": "https://dynatrace-oss.github.io/dtctl/",
      "languages": {
        "Go": 4802905,
        "Nix": 3787,
        "Shell": 5014,
        "Makefile": 7201,
        "PowerShell": 10519
      },
      "pushed_at": "2026-07-21T14:53:14Z",
      "created_at": "2026-01-09T14:29:29Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-21T14:52:53Z",
      "description": "CLI for managing Dynatrace platform resources - built for humans and AI agents alike",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "Apache-2.0",
      "default_branch": "main",
      "license_spdx_raw": "Apache-2.0",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": "https://engineering.dynatrace.com",
      "name": "Dynatrace Open Source",
      "type": "Organization",
      "login": "dynatrace-oss",
      "company": "Dynatrace LLC",
      "location": null,
      "followers": 267,
      "avatar_url": "https://avatars.githubusercontent.com/u/58178984?v=4",
      "created_at": "2019-11-25T14:31:58Z",
      "is_verified": null,
      "public_repos": 94,
      "account_age_days": 2430
    },
    "license": {
      "state": "standard",
      "spdx_id": "Apache-2.0",
      "raw_spdx": "Apache-2.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.35.0",
          "kind": "minor",
          "published_at": "2026-07-21T14:53:14Z"
        },
        {
          "tag": "v0.34.0",
          "kind": "minor",
          "published_at": "2026-07-13T13:29:34Z"
        },
        {
          "tag": "v0.33.0",
          "kind": "minor",
          "published_at": "2026-07-03T13:22:40Z"
        },
        {
          "tag": "v0.32.0",
          "kind": "minor",
          "published_at": "2026-07-02T09:17:43Z"
        },
        {
          "tag": "v0.32.0-rc.4",
          "kind": "prerelease",
          "published_at": "2026-06-30T07:00:29Z"
        },
        {
          "tag": "v0.32.0-rc.3",
          "kind": "prerelease",
          "published_at": "2026-06-26T09:04:03Z"
        },
        {
          "tag": "v0.32.0-rc.2",
          "kind": "prerelease",
          "published_at": "2026-06-24T10:40:51Z"
        },
        {
          "tag": "v0.31.0",
          "kind": "minor",
          "published_at": "2026-06-23T21:11:56Z"
        },
        {
          "tag": "v0.30.3",
          "kind": "patch",
          "published_at": "2026-06-18T09:48:17Z"
        },
        {
          "tag": "v0.30.2",
          "kind": "patch",
          "published_at": "2026-06-16T06:02:11Z"
        },
        {
          "tag": "v0.30.1",
          "kind": "patch",
          "published_at": "2026-06-15T10:52:02Z"
        },
        {
          "tag": "v0.30.0",
          "kind": "minor",
          "published_at": "2026-06-12T14:04:44Z"
        },
        {
          "tag": "v0.29.0",
          "kind": "minor",
          "published_at": "2026-06-11T15:48:29Z"
        },
        {
          "tag": "v0.28.1",
          "kind": "patch",
          "published_at": "2026-05-29T21:53:53Z"
        },
        {
          "tag": "v0.28.0",
          "kind": "minor",
          "published_at": "2026-05-26T09:53:16Z"
        },
        {
          "tag": "v0.27.1",
          "kind": "patch",
          "published_at": "2026-05-11T19:06:53Z"
        },
        {
          "tag": "v0.27.0",
          "kind": "minor",
          "published_at": "2026-05-05T10:24:27Z"
        },
        {
          "tag": "v0.26.2",
          "kind": "patch",
          "published_at": "2026-04-29T05:48:15Z"
        },
        {
          "tag": "v0.26.1",
          "kind": "patch",
          "published_at": "2026-04-28T16:59:41Z"
        },
        {
          "tag": "v0.26.0",
          "kind": "minor",
          "published_at": "2026-04-28T11:09:32Z"
        },
        {
          "tag": "v0.25.2",
          "kind": "patch",
          "published_at": "2026-04-22T20:28:35Z"
        },
        {
          "tag": "v0.25.1",
          "kind": "patch",
          "published_at": "2026-04-21T15:02:17Z"
        },
        {
          "tag": "v0.25.0",
          "kind": "minor",
          "published_at": "2026-04-20T20:32:00Z"
        },
        {
          "tag": "v0.24.0",
          "kind": "minor",
          "published_at": "2026-04-14T20:46:21Z"
        },
        {
          "tag": "v0.23.0",
          "kind": "minor",
          "published_at": "2026-04-10T19:23:20Z"
        },
        {
          "tag": "v0.22.0",
          "kind": "minor",
          "published_at": "2026-04-01T15:37:22Z"
        },
        {
          "tag": "v0.21.0",
          "kind": "minor",
          "published_at": "2026-03-30T18:04:17Z"
        },
        {
          "tag": "v0.20.2",
          "kind": "patch",
          "published_at": "2026-03-30T11:03:30Z"
        },
        {
          "tag": "v0.20.1",
          "kind": "patch",
          "published_at": "2026-03-25T21:28:30Z"
        },
        {
          "tag": "v0.20.0",
          "kind": "minor",
          "published_at": "2026-03-25T16:07:13Z"
        },
        {
          "tag": "v0.19.1",
          "kind": "patch",
          "published_at": "2026-03-20T19:19:30Z"
        },
        {
          "tag": "v0.19.0",
          "kind": "minor",
          "published_at": "2026-03-20T10:33:10Z"
        },
        {
          "tag": "v0.18.0",
          "kind": "minor",
          "published_at": "2026-03-18T11:33:23Z"
        },
        {
          "tag": "v0.17.0",
          "kind": "minor",
          "published_at": "2026-03-16T14:35:27Z"
        },
        {
          "tag": "v0.16.0",
          "kind": "minor",
          "published_at": "2026-03-12T22:13:06Z"
        },
        {
          "tag": "v0.15.0",
          "kind": "minor",
          "published_at": "2026-03-11T11:04:50Z"
        },
        {
          "tag": "v0.14.4",
          "kind": "patch",
          "published_at": "2026-03-10T15:11:20Z"
        },
        {
          "tag": "v0.14.3",
          "kind": "patch",
          "published_at": "2026-03-10T14:57:16Z"
        },
        {
          "tag": "v0.14.2",
          "kind": "patch",
          "published_at": "2026-03-10T13:10:38Z"
        },
        {
          "tag": "v0.14.1",
          "kind": "patch",
          "published_at": "2026-03-09T10:05:13Z"
        },
        {
          "tag": "v0.14.0",
          "kind": "minor",
          "published_at": "2026-03-06T23:51:11Z"
        },
        {
          "tag": "v0.13.3",
          "kind": "patch",
          "published_at": "2026-03-05T12:18:19Z"
        },
        {
          "tag": "v0.13.2",
          "kind": "patch",
          "published_at": "2026-03-04T08:29:56Z"
        },
        {
          "tag": "v0.13.1",
          "kind": "patch",
          "published_at": "2026-03-02T20:09:45Z"
        },
        {
          "tag": "v0.13.0",
          "kind": "minor",
          "published_at": "2026-03-02T13:39:03Z"
        },
        {
          "tag": "v0.12.0",
          "kind": "minor",
          "published_at": "2026-02-26T15:14:46Z"
        },
        {
          "tag": "v0.11.0",
          "kind": "minor",
          "published_at": "2026-02-18T16:39:42Z"
        },
        {
          "tag": "v0.10.0",
          "kind": "minor",
          "published_at": "2026-02-06T13:37:15Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-02-02T23:30:37Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-02-02T17:07:29Z"
        },
        {
          "tag": "v0.7.4",
          "kind": "patch",
          "published_at": "2026-01-22T14:46:21Z"
        },
        {
          "tag": "v0.7.3",
          "kind": "patch",
          "published_at": "2026-01-19T16:59:32Z"
        },
        {
          "tag": "v0.7.2",
          "kind": "patch",
          "published_at": "2026-01-19T09:19:36Z"
        },
        {
          "tag": "v0.7.1",
          "kind": "patch",
          "published_at": "2026-01-18T21:47:40Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-01-16T16:36:52Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-01-15T20:47:06Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-01-14T23:01:03Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-01-13T21:40:15Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-01-13T07:47:36Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "39d109fcfef90adfef19c0c5ec7c0bd41f0acfb0",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release 0.35.0 (#370)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-21T14:52:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "37e7c6e58ffc70caf6f7583703f6e21cbb4cd0a8",
          "body": "…ity discovery (#368)\n\n* feat(inventory): environment data inventory with customizable capability discovery\n\n`dtctl commands` answers \"what can I run?\"; the new `dtctl inventory`\nanswers \"what is there to query?\": which Grail data objects are\nfetchable (and which are query-command-only, like metrics\n[…]\n (deterministic:\nalphabetically first offender).\n\nParseDefinitions keeps its own loop deliberately: a parsed document may\ncarry null (the MergeDefinitions removal marker), which a merged set\nmust not.",
          "is_bot": false,
          "headline": "feat(inventory): environment data inventory with customizable capabil…",
          "author_name": "Christoph Neumüller",
          "author_login": "discostu105",
          "committed_at": "2026-07-21T14:49:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "baf1cb96613e7cebcab07b7ee08a94133d44419c",
          "body": "In agent mode, --metadata/-M was accepted but the requested Grail\nmetadata (executionTimeMilliseconds, scannedRecords/Bytes, sampled,\nqueryId, ...) never reached the envelope: inline results nested it under\nresult.metadata and spilled results dropped it entirely, so an agent\nreading the top-level en\n[…]\ninline and spilled results, mirroring the non-agent -o json --metadata\nshape and honoring field selection. The key is omitted when metadata was\nnot requested or the response carried none.\n\nCloses #362",
          "is_bot": false,
          "headline": "fix(query): surface Grail metadata in the agent envelope (#366)",
          "author_name": "Novikov Kirill",
          "author_login": "knQzx",
          "committed_at": "2026-07-21T14:47:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ce8dbda6dec2bb76e30c066c4b62cd408cd15542",
          "body": "A context created from a bare host without a scheme (e.g.\nabc12345.apps.dynatrace.com) authenticated successfully but every\nsubsequent query failed with \"unsupported protocol scheme\". Normalize\nthe environment URL when persisting a context so a missing scheme\ndefaults to https://, while leaving explicit http:// and https:// URLs\nuntouched.\n\nCloses #292",
          "is_bot": false,
          "headline": "fix(config): normalize environment URL scheme on context creation (#365)",
          "author_name": "Novikov Kirill",
          "author_login": "knQzx",
          "committed_at": "2026-07-21T14:46:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d35b233f46fcef09d0db309d13b3a7baecb4eb30",
          "body": "…idance (#367)\n\n* fix(sdk/query): poll through NOT_STARTED instead of returning it as success\n\nA queued query on a congested tenant answers execute (and early polls)\nwith state NOT_STARTED. Treating any non-RUNNING state as terminal handed\nthe caller the raw {\"state\":\"NOT_STARTED\",\"requestToken\":...\n[…]\n an explicit alias\n- get extension-configs without args: name the missing argument instead\n  of \"accepts 1 arg(s), received 0\"\n\n* style(cmd): rewrite dqlErrorAdvice branch chain as a switch (gocritic)",
          "is_bot": false,
          "headline": "feat(query): agent-mode fix, NOT_STARTED polling, and DQL recovery gu…",
          "author_name": "Christoph Neumüller",
          "author_login": "discostu105",
          "committed_at": "2026-07-18T20:01:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e2f1170ea705378d494ed85d659ddc72c3cd98eb",
          "body": "Bumps [golang.org/x/sys](https://github.com/golang/sys) from 0.46.0 to 0.47.0.\n- [Commits](https://github.com/golang/sys/compare/v0.46.0...v0.47.0)\n\n---\nupdated-dependencies:\n- dependency-name: golang.org/x/sys\n  dependency-version: 0.47.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump golang.org/x/sys from 0.46.0 to 0.47.0 in /sdk (#364)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-18T19:22:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3986117592960804d43e5d9c39b14b0740c34f98",
          "body": "…363)\n\n* fix(auth): cache OAuth access token to cut ~0.5s off every command\n\ndtctl re-ran the SSO refresh-token exchange on every invocation, adding\n~0.5-1s of latency per command. Two issues combined to defeat the existing\ncross-process access-token cache:\n\n1. On macOS the full token JSON exceeds t\n[…]\ncleanup raced the fake store map under `go test -race`. Guard deleteToken\nwith the same lock. Production keyring/file stores are already concurrency-\nsafe; this only affects the in-memory test double.",
          "is_bot": false,
          "headline": "fix(auth): cache OAuth access token to cut ~0.5s off every command (#…",
          "author_name": "Christoph Neumüller",
          "author_login": "discostu105",
          "committed_at": "2026-07-16T15:14:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4ed73c4b84cebb010abeefc57a1bf8b04f08c020",
          "body": "…#360)\n\n* fix(livedebugger): extract message strings from GraphQL error responses\n\nInstead of formatting the raw errors value with %%v (which produces unreadable\nmap[...] output), extract the message field from each GraphQL error object and\njoin them into a human-readable string.\n\n* docs(breakpoints): add condition expression reference to update breakpoint help",
          "is_bot": false,
          "headline": "Parse and show correct GraphQL Facade error for breakpoint commands (…",
          "author_name": "Michael Bishop",
          "author_login": "michaelB1sh",
          "committed_at": "2026-07-16T12:07:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0eb42ae15bc40eb4866b3129583e3a614e1f3c1b",
          "body": "…atch (#359)\n\n* feat: promote the session layer into the sdk and add exec plugin dispatch\n\nEverything a Dynatrace CLI tool needs to go from \"the user's machine\" to\n\"an authenticated client for the right tenant\" now lives in sdk/session:\nthe config model with load/save and schema-version enforcement,\n[…]\npredated sdk/session, was never wired up, and shipping it importable\nin the public SDK is a misuse trap (tokens written through it are not\nfound by dtctl). Removed before the first tagged sdk release.",
          "is_bot": false,
          "headline": "feat: promote the session layer into the sdk and add exec plugin disp…",
          "author_name": "Christoph Neumüller",
          "author_login": "discostu105",
          "committed_at": "2026-07-15T11:05:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "74db063d50a8ed152224103c7c0ade9e9ba7943c",
          "body": "…nable queries (#358)\n\n* feat(query): explain the double-quote rule on single-quote DQL errors\n\nDQL string literals require double quotes; single quotes fail with\nPARSE_ERROR_SINGLE_QUOTES, which is almost always a shell-quoting\ncollision (wrapping the query in double quotes leaves no room for\ndoubl\n[…]\n a troubleshooting entry\ncovering PARSE_ERROR_SINGLE_QUOTES and the silent zero-rows trap from an\nunquoted bareword, with per-shell command wrappers so agents stop\ngenerating single-quoted DQL values.",
          "is_bot": false,
          "headline": "feat(query): guide users to double quotes and fail wait fast on unrun…",
          "author_name": "Christoph Neumüller",
          "author_login": "discostu105",
          "committed_at": "2026-07-14T18:52:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6ae420555c1e1c3102d1ac5d6cb32d386706fd84",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release 0.34.0 (#357)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-13T13:23:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72f78bc16f7a0f07166ec6f77b2592c5eeb43bce",
          "body": "The machine-readable command catalog (dtctl commands) defaulted to the full\nJSON listing (~52KB), which is far more than an agent needs to orient. Most\nverb-noun commands are self-explanatory.\n\nIntroduce three progressive detail tiers:\n  - default: minimal overview (verbs, resources, subcommands onl\n[…]\n default output format is now\nTOON; pass -o json/-o yaml to override.\n\nAdd Minimal/NewMinimal and a generic WriteValue helper. Docs updated across\nAGENTS.md, README, SKILL.md, the spec, and site docs.",
          "is_bot": false,
          "headline": "feat(commands): default to a minimal TOON overview, add --full (#356)",
          "author_name": "Christoph Neumüller",
          "author_login": "discostu105",
          "committed_at": "2026-07-13T13:15:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "81852ce0a44106db1e228ae179da51aa1e6e7d2c",
          "body": "* chore(deps): bump golang.org/x/term from 0.44.0 to 0.45.0\n\nBumps [golang.org/x/term](https://github.com/golang/term) from 0.44.0 to 0.45.0.\n- [Commits](https://github.com/golang/term/compare/v0.44.0...v0.45.0)\n\n---\nupdated-dependencies:\n- dependency-name: golang.org/x/term\n  dependency-version: 0.\n[…]\n3+dependabot[bot]@users.noreply.github.com>\nCo-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>\nCo-authored-by: Christoph Neumüller <christoph.neumueller@dynatrace.com>",
          "is_bot": true,
          "headline": "chore(deps): bump golang.org/x/term from 0.44.0 to 0.45.0 (#355)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-13T13:10:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "55a0a54e8576ec16f5fc2c5149c3b16dbc1979ae",
          "body": "…et (#351)\n\n* docs: add command profiles design proposal\n\n* docs: simplify command profiles to a default-deny allowlist\n\nAdopt six simplifications: allowlist-only (drop exclude), decouple safety\nlevels entirely (drop profile-pinned safety-level), drop extends/inheritance,\ndrop global current-profile\n[…]\nFlagValue stops at the \"--\" end-of-flags terminator, and the\nblock message text is shared between ProfileError.Error() and the agent-mode\nErrorDetail via Headline()/Suggestions() so they cannot drift.",
          "is_bot": false,
          "headline": "feat(profile): add command profiles to restrict the exposed command s…",
          "author_name": "Christoph Neumüller",
          "author_login": "discostu105",
          "committed_at": "2026-07-13T12:31:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b2008f01fc605a59a43909848410784ecc1d8e76",
          "body": "* feat(config): honor DTCTL_CONFIG as a trusted explicit config\n\nAdd a DTCTL_CONFIG environment variable that names a config file and is\ntreated exactly like --config: dtctl loads that file, honors its aliases\nand apply hooks, and skips auto-discovery entirely.\n\nThis restores hooks/aliases for prepa\n[…]\nboth saveConfig and the viper config-\nfile diagnostic so writes and the '-v' 'Using config file' message target\nthe DTCTL_CONFIG file. Add TestEnvConfigSaveRoundTrips covering the\nround-trip property.",
          "is_bot": false,
          "headline": "feat(config): honor DTCTL_CONFIG as a trusted explicit config (#352)",
          "author_name": "Christoph Neumüller",
          "author_login": "discostu105",
          "committed_at": "2026-07-13T12:30:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f29e73b09971d331c914b8969cb42ed4e914aec2",
          "body": "Bumps [golang.org/x/text](https://github.com/golang/text) from 0.38.0 to 0.40.0.\n- [Release notes](https://github.com/golang/text/releases)\n- [Commits](https://github.com/golang/text/compare/v0.38.0...v0.40.0)\n\n---\nupdated-dependencies:\n- dependency-name: golang.org/x/text\n  dependency-version: 0.40\n[…]\nirect:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump golang.org/x/text from 0.38.0 to 0.40.0 (#354)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-13T12:30:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6fc1cf296070da365d70d07fe687725392fb0abf",
          "body": "Bumps [golang.org/x/sys](https://github.com/golang/sys) from 0.46.0 to 0.47.0.\n- [Commits](https://github.com/golang/sys/compare/v0.46.0...v0.47.0)\n\n---\nupdated-dependencies:\n- dependency-name: golang.org/x/sys\n  dependency-version: 0.47.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump golang.org/x/sys from 0.46.0 to 0.47.0 (#353)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-13T12:29:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7c60c66f2be32d4e86cf3c3b7ac5b001eda3e2df",
          "body": "…settings commands (#341)\n\n* feat(settings): add --validate-only flag to create, edit, and delete settings commands\n\nExposes the Settings API validateOnly query parameter through the CLI:\n- create settings --validate-only: POSTs with ?validateOnly=true, skips safety check\n- edit setting --validate-o\n[…]\nexample clarifying the editor still opens but changes are not persisted\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(settings): add --validate-only flag to create, edit, and delete …",
          "author_name": "katarzyna-szczerba",
          "author_login": "katarzyna-szczerba",
          "committed_at": "2026-07-10T10:07:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9533536be617e2a5825d3f3e78ce3c33d6c5e8d3",
          "body": "* Initial plan\n\n* chore: bump Go toolchain to 1.26.5\n\n---------\n\nCo-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "chore: bump Go toolchain to 1.26.5 (#350)",
          "author_name": "Copilot",
          "author_login": "Copilot",
          "committed_at": "2026-07-10T09:59:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a41e5f068b62db4941c0dcfeb13ef2086646670e",
          "body": "App engine returns field lastModifiedAt in modificationInfo. We\ncurrently use incorrect field name `lastModifiedTime`, hence rename it",
          "is_bot": false,
          "headline": "fix(get): get app should show correct last modification time (#339)",
          "author_name": "khainguyendt",
          "author_login": "khainguyendt",
          "committed_at": "2026-07-08T08:32:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "16e11ab0ffd9f87734223915c0c55e5d2ff60fdb",
          "body": "…g configs (#308)\n\n* feat(cloud): add disable command and edit support for cloud monitoring configs\n\nNew commands:\n- `dtctl disable aws|azure|gcp monitoring` — disables a monitoring config and all\n  its credentials in a single PUT (inverse of `dtctl enable`)\n- `dtctl edit aws|azure|gcp monitoring` —\n[…]\nle pattern\n- Guard against whitespace-only EDITOR panicking on parts[0]\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cloud): add disable command and edit support for cloud monitorin…",
          "author_name": "Pawel Siwek",
          "author_login": "pawelsiwek",
          "committed_at": "2026-07-06T14:38:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d99d56d6057f25e3b65f59c1a4b838f1e741247b",
          "body": "* feat(query): add live progress bar for long-running queries\n\nSurface the DQL Query API's progress percentage and preview results\nduring polling via a new --progress flag (auto|always|never).\n\n- sdk/api/query: add ExecuteAndPollWithOptions with an OnUpdate callback\n  that fires on each RUNNING poll\n[…]\nth no volume.\n- Reuse the exported output.Colorize instead of a duplicate local colorize.\n\nAdds boundary tests for formatElapsed/humanizeMetric and tests for terminal\nwidth clamping / truncateVisible.",
          "is_bot": false,
          "headline": "feat(query): live progress bar for long-running queries (#336)",
          "author_name": "Christoph Neumüller",
          "author_login": "discostu105",
          "committed_at": "2026-07-03T21:02:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "94b46e8b0cbfacfce1d5883c332ed973dc372dac",
          "body": "Bumps [golang.org/x/net](https://github.com/golang/net) from 0.54.0 to 0.55.0.\n- [Commits](https://github.com/golang/net/compare/v0.54.0...v0.55.0)\n\n---\nupdated-dependencies:\n- dependency-name: golang.org/x/net\n  dependency-version: 0.55.0\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump golang.org/x/net from 0.54.0 to 0.55.0 in /sdk (#335)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-03T19:19:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b822c8eb0712c13c2e515573cbf5fc79980ef3a9",
          "body": "Split the single Davis AI docs-site page into two focused pages\n(/docs/analyzers/ and /docs/copilot/) and drop the Davis branding from\ntitles, nav, and headings.\n\n- Add the previously-undocumented 'describe analyzer' command with an\n  example and sample output, and round out the analyzers page (list\n[…]\ns own page (chat, nl2dql, dql2nl, document-search,\n  skills) with granular per-feature scopes.\n- Update the docs nav, README resource-guide links/table, and index\n  feature table to the two new pages.",
          "is_bot": false,
          "headline": "docs: split Davis AI docs into Analyzers and CoPilot pages (#337)",
          "author_name": "Christoph Neumüller",
          "author_login": "discostu105",
          "committed_at": "2026-07-03T19:18:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "326dd087b1d594b0e934ce941e989b01ffbbf6e1",
          "body": null,
          "is_bot": false,
          "headline": "docs: add clickable anchor links to doc section headings (#334)",
          "author_name": "Christoph Neumüller",
          "author_login": "discostu105",
          "committed_at": "2026-07-03T18:53:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8b8a8a6f3f59a18f34133d7bed3837689c24e0f9",
          "body": "…@ help (#333)\n\nexec function has two modes but only app-function invocation was documented.\nDocument the ad-hoc JavaScript mode (--code, -f/--file) and the previously\nundocumented --data (payload from file/stdin) and --defer (async) flags, plus\nthe mode-selection semantics (--code/-f select ad-hoc \n[…]\nes.\n- docs/dev/API_DESIGN.md: fix --data @ example; --defer is implemented (was\n  marked 'not implemented yet'); add ad-hoc examples.\n\nVerified against the built binary; cmd/exec/appengine tests pass.",
          "is_bot": false,
          "headline": "docs: document exec function ad-hoc mode, --data/--defer; fix --data …",
          "author_name": "Christoph Neumüller",
          "author_login": "discostu105",
          "committed_at": "2026-07-03T18:23:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2f9eeda428a2e0a3cffbc63d451521df36c3fd57",
          "body": "…it (#332)\n\nAudit the GitHub Pages docs against the actual CLI surface and close gaps in\nthe query/reference pages.\n\n- dql-queries: rewrite Additional Parameters to cover every query flag\n  (client-context, fetch-timeout-seconds, enforce-query-consumption-limit,\n  include-types, include-contribution\n[…]\nt Commands section.\n- configuration: document the full ctx subcommand set.\n- live-debugger: fix --decode-snapshots --full to --decode-snapshots=full.\n\nAll flag names verified against the built binary.",
          "is_bot": false,
          "headline": "docs: document query parameters, auth status, ctx subcommands, and wa…",
          "author_name": "Christoph Neumüller",
          "author_login": "discostu105",
          "committed_at": "2026-07-03T18:06:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8c19a01b0354068b16228d0815a34696d76425b3",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release 0.33.0",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-03T13:22:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2c16a9c107979c44903c18a172b9297973797c5a",
          "body": "…#321)\n\n* feat(extension): add --assets flag and -o zip to describe extension\n\nAdds two new capabilities to `dtctl describe extension`:\n\n- `-o zip` downloads the extension package as raw bytes (redirect to file)\n- `--assets=<types>` inspects bundled asset types from the zip package;\n  supported type\n[…]\n Claude Sonnet 4.6 <noreply@anthropic.com>\nCo-authored-by: Christoph Neumueller <christoph.neumueller@dynatrace.com>\nCo-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(extension): add --assets flag and -o zip to describe extension (…",
          "author_name": "MaciejGrynda",
          "author_login": "MaciejGrynda",
          "committed_at": "2026-07-03T13:00:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2faa5888b0da9891c282a7e26c81349a6c1169c4",
          "body": "* feat(breakpoint): add --filters to create breakpoint\n\nAllow setting workspace filters and creating a breakpoint in a single\ncommand. Previously, filters had to be configured up front via\n'update breakpoint --filters' before any breakpoint could be created.\n\n- Add optional --filters flag to 'create\n[…]\neate/update now uses\n  printBreakpointMessage instead of raw fmt.Println, matching the\n  delete command convention\n\n---------\n\nCo-authored-by: Christoph Neumueller <christoph.neumueller@dynatrace.com>",
          "is_bot": false,
          "headline": "feat(breakpoint): add --filters to create breakpoint (#318)",
          "author_name": "Michael Bishop",
          "author_login": "michaelB1sh",
          "committed_at": "2026-07-03T12:15:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8f7a68078237d08cf39a7d5674b4115f269c48de",
          "body": "… expose displayName/description/unit (#330)\n\nThe DQL query API only enriches metadata.metrics[] with catalogue fields\n(displayName, description, unit) when the request carries the\n`enrich=metric-metadata` query-string parameter on query:execute and\nquery:poll. dtctl never sent it, so those fields w\n[…]\n: SDK unmarshal + enrich-param-sent/gating unit tests, output footer\n  and map assertions, and an integration test that verifies enrichment\n  end-to-end (and that omitting it leaves the fields empty).",
          "is_bot": false,
          "headline": "feat(query): request metric-metadata enrichment so timeseries metrics…",
          "author_name": "Christoph Neumüller",
          "author_login": "discostu105",
          "committed_at": "2026-07-03T12:00:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0afb6f5871fab2095d28d0420c4807ddbacaa8c5",
          "body": "…in agent mode (#328)\n\n* feat(query): surface scan-limit truncation and reduction advice in agent mode\n\nWhen a query hits the scan limit (or a result/timeout/consumption cap), the\nresult returned is PARTIAL, but agent mode only signalled this on stderr — an\nagent parsing the JSON envelope on stdout \n[…]\nsum(dt.system.sampling_ratio)\nextrapolation tip. For exact values, steer to removing samplingRatio from the\nfetch rather than only --default-sampling-ratio 1 (which cannot override an\nin-query ratio).",
          "is_bot": false,
          "headline": "feat(query): surface scan-limit truncation and data-reduction advice …",
          "author_name": "Christoph Neumüller",
          "author_login": "discostu105",
          "committed_at": "2026-07-03T11:57:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f2cabe2b9fc11f44f906f8e6f834c26f06555448",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release 0.32.0",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-02T09:17:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d4e51439e112203dec76cad8f42711f6b0671a0d",
          "body": "…adata=metrics (#326)\n\n* feat(query): expose metadata.metrics for timeseries queries via --metadata=metrics\n\nThe DQL API returns a metadata.metrics array alongside metadata.grail for\ntimeseries queries, describing each referenced metric (key, field alias,\naggregation, and optionally display name and\n[…]\nsilently\ndropped. Also fixes CI: shell-completion tests hardcoded the total\nmetadata field count and broke when \"metrics\" was added, and updates the\nstale --metadata field list in docs/QUICK_START.md.",
          "is_bot": false,
          "headline": "feat(query): expose metadata.metrics for timeseries queries via --met…",
          "author_name": "Christoph Neumüller",
          "author_login": "discostu105",
          "committed_at": "2026-07-02T09:09:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "03928ae80cc69493d3e4d8b6e88691f39103e12f",
          "body": "…324)\n\n* docs(analyzer): design for dtctl describe analyzer\n\n* docs(analyzer): lock option A, add verify analyzer command\n\n* feat(analyzer): add describe analyzer and verify analyzer commands\n\n- describe analyzer resolves and bundles input/result JSON Schemas, rendering\n  required/optional inputs; s\n[…]\n mapper\n  always returns non-zero when err != nil).\n- Cover the guard with a cmd unit test and assert the live validate verdict\n  maps to the 0/1 verify exit-code contract in the integration e2e test.",
          "is_bot": false,
          "headline": "feat(analyzer): add describe analyzer and verify analyzer commands (#…",
          "author_name": "Christoph Neumüller",
          "author_login": "discostu105",
          "committed_at": "2026-07-02T08:12:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4e4fcd871672c63d48a8a769a47ed8a12589bd92",
          "body": "… v1.41.0 (#322)\n\n* feat(get): align classic-pipelines-translation flag defaults with API v1.41.0\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\n\n* docs: update in-command help example to match new skip-disabled-rules default\n\n---------\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>\nCo-authored-by: Christoph Neumueller <christoph.neumueller@dynatrace.com>",
          "is_bot": false,
          "headline": "feat(get): align classic-pipelines-translation flag defaults with API…",
          "author_name": "katarzyna-szczerba",
          "author_login": "katarzyna-szczerba",
          "committed_at": "2026-07-02T08:03:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ab44c962fc341e346f2ac3c6ea10aba746345af9",
          "body": "… (#325)\n\n* feat(extension): add --feature-set-metrics flag to describe extension (#323)\n\n- Add --feature-set-metrics flag to dtctl describe extension; without it,\n  feature sets show only names (table) and a plain string array (JSON/YAML)\n- Fix SDK JSON tag featureSetDetails → featureSetsDetails to\n[…]\n for both flag states and\n  the empty-feature-sets case.\n\n---------\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>\nCo-authored-by: Christoph Neumueller <christoph.neumueller@dynatrace.com>",
          "is_bot": false,
          "headline": "feat(extension): add --feature-set-metrics flag to describe extension…",
          "author_name": "MaciejGrynda",
          "author_login": "MaciejGrynda",
          "committed_at": "2026-07-02T07:48:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cff62d1113425cb96d2a21707508d3099953c0bc",
          "body": "….0 (#316)\n\nBumps [github.com/guptarohit/asciigraph](https://github.com/guptarohit/asciigraph) from 0.9.0 to 0.10.0.\n- [Release notes](https://github.com/guptarohit/asciigraph/releases)\n- [Changelog](https://github.com/guptarohit/asciigraph/blob/master/CHANGELOG.md)\n- [Commits](https://github.com/gu\n[…]\nirect:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump github.com/guptarohit/asciigraph from 0.9.0 to 0.10…",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-30T06:53:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e22d4ecbce7fe887f33338b4155edb3a00808e91",
          "body": "…pill guarded) (#317)\n\nOn `inspect`, `--jq` now runs as a streaming filter over the WHOLE spilled file\n(per record, like jq over NDJSON) instead of post-filtering the already-windowed\nrows — giving a sandboxed agent the \"only the matching rows\" capability without\nre-querying Grail and without a besp\n[…]\ngh the existing maybeRespill\n  byte-budget guard (IN8): over threshold it re-spills to a new managed file\n  whose contents are the FILTERED rows, with sampling provenance preserved (IN3).\n\nCloses #313",
          "is_bot": false,
          "headline": "feat(inspect): full-file predicate filtering via streaming --jq (re-s…",
          "author_name": "Christoph Neumüller",
          "author_login": "discostu105",
          "committed_at": "2026-06-30T06:53:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cdafbc6754a608e213f907d3b0f5de06003869aa",
          "body": "…lts (PR4) (#312)\n\n* feat(inspect): add `dtctl inspect` for local analysis of spilled results (PR4)\n\nLayer 2 of the result-spill design: a small, fixed set of pure-Go analytics\nprimitives over a file that `dtctl query` spilled to disk, so an agent (or\nhuman) can interrogate the rows without re-query\n[…]\nll\n  file — the large window IN8 re-spill exists to handle no longer risks\n  OOM before re-spill runs. readTail grows its ring lazily up to N. Add\n  a regression test for N far above the prealloc cap.",
          "is_bot": false,
          "headline": "feat(inspect): add `dtctl inspect` for local analysis of spilled resu…",
          "author_name": "Christoph Neumüller",
          "author_login": "discostu105",
          "committed_at": "2026-06-26T09:00:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0c2fb5c9267601ad54d77d61a0190b61d8143eb7",
          "body": "…alog (#309)\n\n* docs(commands): add Smartscape DQL discovery patterns to commands catalog\n\nAgents bootstrapping from dtctl commands now have grounded guidance for\nquerying Smartscape topology: correct DQL function name, a discovery query\nto enumerate valid node type IDs, and an explicit antipattern \n[…]\nnts survive\nbrief mode, and fix the schema-command docs.\n\n---------\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>\nCo-authored-by: Christoph Neumueller <christoph.neumueller@dynatrace.com>",
          "is_bot": false,
          "headline": "docs(commands): add Smartscape DQL discovery patterns to commands cat…",
          "author_name": "John Gallagher",
          "author_login": "johngallagherdynatrace",
          "committed_at": "2026-06-26T08:42:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fc8eea42ac7c07e913d2cd484566802eebda0eec",
          "body": "…ll (#311)\n\n* docs(skills): add token-frugal log pattern analysis loop to dtctl skill\n\n* test(skills): update installed-skill assertions for compacted dtctl skill\n\nPR #307 compacted skills/dtctl/SKILL.md (307->~128 lines) and renamed\nits sections, but installer_test.go still asserted the old section\nnames and a 200+ line floor, leaving main red. Align the assertions\nwith the current structure.",
          "is_bot": false,
          "headline": "docs(skills): add token-frugal log pattern analysis loop to dtctl ski…",
          "author_name": "Christoph Neumüller",
          "author_login": "discostu105",
          "committed_at": "2026-06-25T14:39:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6e0aa881805fb88b7ab1ca5d33bfb79968586244",
          "body": "… dtctl skill (#307)\n\n* docs(skills): document toon output, --jq, and query result spill\n\nBring the dtctl skill in line with the agent-facing surface:\n\n- add -o toon (token-efficient structured output) and the --jq filter to\n  the Output Modes section, recommending both for agents\n- document that dt\n[…]\nlongside the other\n  machine formats; both feed the large-result / DuckDB workflow\n- add segment (DQL filter segments), anomaly-detector, and the generic\n  document to the agent-relevant resource list",
          "is_bot": false,
          "headline": "docs(skills): refresh agent surface (toon/--jq/spill) and compact the…",
          "author_name": "Christoph Neumüller",
          "author_login": "discostu105",
          "committed_at": "2026-06-24T07:38:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5eb1ceeb53a85a2695dcbdfad4e69a87e86a6d89",
          "body": "…ope (PR2) (#294)\n\n* feat(query): spill large results to a local file with a summary envelope (PR2)\n\nWhen an agent raises the record cap for an export or full-population scan,\nserialising tens of thousands of rows into the model's context can cost\nmillions of tokens. `dtctl query` now measures the s\n[…]\nmit' / '| fields'), while a\none-off write failure keeps the --spill-to retry advice. Also stop the\ncolumns_omitted hint from pointing at a sidecar that does not exist when\nnothing was written to disk.",
          "is_bot": false,
          "headline": "feat(query): spill large results to a local file with a summary envel…",
          "author_name": "Christoph Neumüller",
          "author_login": "discostu105",
          "committed_at": "2026-06-24T07:24:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4f921d221b432d2a62ef439849df4baa53f057fb",
          "body": "Switch the release workflow trigger from `push: [main]` to\n`workflow_dispatch` so releases never happen on ordinary merges. A\nrelease is now an explicit, maintainer-driven two-step: dispatch to\nbuild/update the release PR, merge it, then dispatch again to create the\ntag + GitHub Release and run GoRe\n[…]\naser. This also removes the race where\ntwo overlapping push-triggered runs could overwrite the release PR.\n\nUpdate the dtctl-release skill and CONTRIBUTING.md to document the manual\ntwo-dispatch flow.",
          "is_bot": false,
          "headline": "ci: make releases manual (workflow_dispatch only) (#306)",
          "author_name": "Christoph Neumüller",
          "author_login": "discostu105",
          "committed_at": "2026-06-23T21:14:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0eaed8858d760d110ee16081f906c3b37fb120bf",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release 0.31.0 (#303)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-23T21:11:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8834082f82f773e408eccb5d39eabefc393de0f1",
          "body": "…in-tag false) (#305)\n\nThe first release PR (#303) dumped the entire commit history into the\nrelease notes because release-please prepended the `dtctl` component to\ntags and searched for `dtctl-v*`, which don't exist — so it never found\nv0.30.3 as the baseline (\"Found release tag with component '', \n[…]\ndefaults to true in\nthe config file. Setting it false makes release-please match the\nexisting `v0.30.3` tags, so the release PR only contains commits since\nthe last release and the tag stays `vX.Y.Z`.",
          "is_bot": false,
          "headline": "fix(ci): match existing v* tags in release-please (include-component-…",
          "author_name": "Christoph Neumüller",
          "author_login": "discostu105",
          "committed_at": "2026-06-23T20:59:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7c43e6f6ac912ad4fdc85925f0a746bc1c0ae8ae",
          "body": "TestQueryVerify_ValidQuery and TestQueryVerify_TemplateVariables hard-coded\n`fetch dt.entity.host`, which the DQL API rejects as UNKNOWN_DATA_OBJECT on\nGrail-only tenants (classic dt.entity.* and smartscapeNodes data objects are\nnot available there), so both expected-valid cases failed with valid=fa\n[…]\n\non any tenant, preserving each case's intent: a fetch with a fields\nprojection, and a template variable in the data-object position. Comments\nnote why dt.entity.* is avoided so it isn't reintroduced.",
          "is_bot": false,
          "headline": "test(e2e): use Grail data objects in query-verify tests (#304)",
          "author_name": "Christoph Neumüller",
          "author_login": "discostu105",
          "committed_at": "2026-06-23T20:58:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8da00e199c7c782c42f12f9166044047b49bbc50",
          "body": "…(#295)\n\n* feat(commands): expose required token scopes in the commands catalog\n\nAdd a canonical (resource, access) -> scopes table in pkg/auth and surface\nper-command required scopes through `dtctl commands`, so agents and operators\ncan determine least-privilege token scopes before running a comman\n[…]\nthe notification fix closes).\n- `ctx token` only prints the locally-stored credential, so mark it local\n  (no platform scope).\n\nUpdates the pinned per-level baseline and docs/TOKEN_SCOPES.md to match.",
          "is_bot": false,
          "headline": "feat(commands): expose required token scopes in the commands catalog …",
          "author_name": "Christoph Neumüller",
          "author_login": "discostu105",
          "committed_at": "2026-06-23T20:49:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0aa186d97285d737ebd246646c4c590c619b8cd2",
          "body": "…en cmd (#298)\n\n* feat(azure): add clientSecret credential flags to create/update connection\n\n- dtctl create azure connection now accepts --directoryId, --applicationId,\n  --clientSecret flags for clientSecret type (full one-command setup)\n- dtctl update azure connection now accepts --clientSecret f\n[…]\ntorKeyringCheck already does) so the lookup is hermetic.\n\n---------\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>\nCo-authored-by: Christoph Neumueller <christoph.neumueller@dynatrace.com>",
          "is_bot": false,
          "headline": "feat(azure): federated issuer override + clientSecret flags + ctx tok…",
          "author_name": "Pawel Siwek",
          "author_login": "pawelsiwek",
          "committed_at": "2026-06-23T20:15:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6ccd20a0c7baa4f6fe5894c99a660b7a23444854",
          "body": "Replace the hand-maintained CHANGELOG.md (a frequent merge-conflict\nsource) with release-please-driven release automation.\n\n- Add release-please-config.json (release-type go, skip-changelog) and\n  .release-please-manifest.json pinned at 0.30.3\n- Keep pkg/version/version.go in sync via the x-release-\n[…]\nve CHANGELOG.md; the GitHub Release is now the canonical changelog\n- Update dtctl-release/pr-review skills, AGENTS.md, CONTRIBUTING.md, and\n  design docs to the conventional-commit/release-please flow",
          "is_bot": false,
          "headline": "ci: automate releases with release-please, drop manual CHANGELOG (#302)",
          "author_name": "Christoph Neumüller",
          "author_login": "discostu105",
          "committed_at": "2026-06-23T20:14:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0e8bcdafdcba6686c6b09cb31a754eaee7213807",
          "body": "* feat(get): add classic-pipelines-translation command\n\nAdd a read-only `dtctl get classic-pipelines-translation <logs|bizevents>`\ncommand that calls the OpenPipeline classic-pipelines translation endpoint\n(GET /platform/openpipeline/v1/classic-pipelines/translate) and returns the\ntranslated OpenPip\n[…]\nin:openpipeline.<scope>.pipelines).\n- Strengthen the agent-mode test to assert the envelope carries the\n  value, the partial-translation warning, and the apply suggestion;\n  add a TOON rendering test.",
          "is_bot": false,
          "headline": "feat(get): add classic-pipelines-translation command (#296)",
          "author_name": "Christoph Neumüller",
          "author_login": "discostu105",
          "committed_at": "2026-06-23T18:25:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "eff0f5aeeb25e2394be3d7b37b538ef95555f4a6",
          "body": null,
          "is_bot": false,
          "headline": "feat(httpclient): surface API error details in error messages (#300)",
          "author_name": "Christoph Bonitz",
          "author_login": "chbo-dt",
          "committed_at": "2026-06-23T13:48:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ad397c3180e828f160e7bd1faad2cdee98aadd4b",
          "body": "An empty DQL result produced a column-less Parquet file. While that is a\nstructurally valid container (parquet-go reopens it fine), mainstream\nreaders reject it: DuckDB, pyarrow, and pandas all fail with \"Need at\nleast one non-root column in the file\". The DQL API returns no type info\nfor an empty r\n[…]\ntParquetPrinter_EmptyWithTypesKeepsSchema\nasserts the placeholder does not leak into a real typed schema.\n\nVerified end-to-end against a live tenant with DuckDB reading the export.\n\nFollow-up to #293.",
          "is_bot": false,
          "headline": "fix(output): emit a placeholder column for empty Parquet results (#297)",
          "author_name": "Christoph Neumüller",
          "author_login": "discostu105",
          "committed_at": "2026-06-23T07:19:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2f88e7ba1f3ea0c5762500f4667f5add72155ad2",
          "body": "* feat(query): add jsonl and parquet output formats\n\nAdd two first-class -o output formats for `dtctl query`, aimed at large\nresult exports (PR1 of the result-spill design — formats only, no spill\nmachinery or envelope changes).\n\n- `-o jsonl`: newline-delimited JSON, one compact object per line, str\n[…]\nral and in range (reject NaN/Inf/fractional/overflow) rather\nthan silently truncating. Also flush parquet in bounded row groups and reuse\nthe caller's record slice to cap peak memory on large exports.",
          "is_bot": false,
          "headline": "feat(query): add jsonl and parquet output formats (#293)",
          "author_name": "Christoph Neumüller",
          "author_login": "discostu105",
          "committed_at": "2026-06-23T07:09:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f6d87901e98bfa02441d52c6509895cf73dc7b19",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.30.3 changelog",
          "author_name": "Christoph Neumueller",
          "author_login": "discostu105",
          "committed_at": "2026-06-18T09:44:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2a31677db0f2eace23da7ff0fc9d9e9ba99b7f06",
          "body": "… Keychain limit (#291)\n\nFixes #290\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(auth): fall back to file storage when refresh token exceeds macOS…",
          "author_name": "Christian Kreuzberger",
          "author_login": "christian-kreuzberger-dtx",
          "committed_at": "2026-06-18T09:41:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "486422f14d5005799049f4f0b7768b86aaf6ca45",
          "body": "The agent-mode detection map only checked GITHUB_COPILOT, which the\nstandalone GitHub Copilot CLI does not set, so dtctl did not detect it.\n\nVerified against copilot v1.0.63: it injects COPILOT_CLI=1 into every\nsubprocess it spawns. The @github/copilot SDK that sets it is also\nbundled in VS Code Copilot, so this single entry covers both surfaces.\nGITHUB_COPILOT is left in place unchanged.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: detect GitHub Copilot CLI via COPILOT_CLI env var (#289)",
          "author_name": "Jakub",
          "author_login": "jakubrogowski-dt",
          "committed_at": "2026-06-18T07:28:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "110417d8625abc93e437488068de5f57d83fc1ed",
          "body": "Bumps [golang.org/x/text](https://github.com/golang/text) from 0.37.0 to 0.38.0.\n- [Release notes](https://github.com/golang/text/releases)\n- [Commits](https://github.com/golang/text/compare/v0.37.0...v0.38.0)\n\n---\nupdated-dependencies:\n- dependency-name: golang.org/x/text\n  dependency-version: 0.38\n[…]\nirect:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump golang.org/x/text from 0.37.0 to 0.38.0 (#279)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-16T06:15:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6021a5e662d54d8f3c2757c9cff4d596fef15586",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.30.2 changelog",
          "author_name": "Christoph Neumueller",
          "author_login": "discostu105",
          "committed_at": "2026-06-16T05:55:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cdfe042333de6b06fba7c175648208d9fcdd9528",
          "body": "Kiro detection was keyed on a KIRO environment variable that Kiro does\nnot set, so Detect() never identified a Kiro session and UserAgentSuffix\nreturned empty under Kiro.\n\nAdd the env vars Kiro actually sets. Verified on kiro-cli 2.6.1:\nAGENT_CONTEXT_OUT (the documented ACP side-channel FIFO) is exp\n[…]\ndetecting on\nAGENT_CONTEXT_OUT alone still misses headless Kiro. Key on both, and\nkeep the existing KIRO entry as a manual override.\n\nFixes #282\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: detect Kiro via the env vars it actually sets (#283)",
          "author_name": "Carl Audet",
          "author_login": "carl-audet",
          "committed_at": "2026-06-16T05:50:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ca0366961ebd4f3e30b58daed2da72adb8055896",
          "body": "…(#284)\n\n'dtctl auth whoami' hits the platform metadata API and requires an\nOAuth/JWT token with the 'app-engine:apps:run' scope. With a plain API\ntoken or a read-scoped platform token it returns a spurious 403 (and the\nJWT fallback fails, since those tokens are not JWTs) even though read\naccess wor\n[…]\nontext-inspection and troubleshooting flows with\n'dtctl auth status' (token-type aware, works with any credential) and add\na note that connectivity is confirmed by a real query, not an identity probe.",
          "is_bot": false,
          "headline": "fix(skills): stop recommending 'auth whoami' as a connectivity check …",
          "author_name": "Benedict Evert",
          "author_login": "dt-benedict",
          "committed_at": "2026-06-15T18:00:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1797b319da71abe3c6d0a8bbac78887af1bf00f5",
          "body": "Bumps [golang.org/x/term](https://github.com/golang/term) from 0.43.0 to 0.44.0.\n- [Commits](https://github.com/golang/term/compare/v0.43.0...v0.44.0)\n\n---\nupdated-dependencies:\n- dependency-name: golang.org/x/term\n  dependency-version: 0.44.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump golang.org/x/term from 0.43.0 to 0.44.0 (#278)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-15T15:15:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a62b366a2c02b9a010724a057fc35b669cf5ab64",
          "body": "Bumps [github.com/itchyny/gojq](https://github.com/itchyny/gojq) from 0.12.17 to 0.12.19.\n- [Release notes](https://github.com/itchyny/gojq/releases)\n- [Changelog](https://github.com/itchyny/gojq/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/itchyny/gojq/compare/v0.12.17...v0.12.19)\n\n---\nup\n[…]\nirect:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump github.com/itchyny/gojq from 0.12.17 to 0.12.19 (#280)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-15T15:15:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c024068ca682eceddbd980db067bed3540691781",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): polish v0.30.1 release notes",
          "author_name": "Christoph Neumueller",
          "author_login": "discostu105",
          "committed_at": "2026-06-15T10:58:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c391bec46b5c24ba8976f90e868616129dc0174a",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.30.1 changelog",
          "author_name": "Christoph Neumueller",
          "author_login": "discostu105",
          "committed_at": "2026-06-15T09:32:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d30c6cc2e19279975a509b6cdda277770d4160bd",
          "body": "…and snapshots (#281)\n\n* fix(document): restore structured content in get dashboard -o yaml/json\n\nThe SDK extraction in 0.28.0 (#239) split the document model into an SDK\ntype and a CLI read-model type, but the CLI type only carried UnmarshalJSON\n— its MarshalJSON/MarshalYAML were not ported. Since \n[…]\nlay-field leakage), a unit test\nfor the shared helper, and single-object golden fixtures for the analyzer\ndefinition and snapshot. Verified all new guards fail without the fix.\n\nAffects 0.28.0-0.30.0.",
          "is_bot": false,
          "headline": "fix(output): restore structured YAML/JSON for dashboards, analyzers, …",
          "author_name": "Christoph Neumüller",
          "author_login": "discostu105",
          "committed_at": "2026-06-15T09:29:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1a25ff245ad259a7f7744318b15b87983dc82e71",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.30.0 changelog",
          "author_name": "Christoph Neumueller",
          "author_login": "discostu105",
          "committed_at": "2026-06-12T14:01:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "47edc0e63758b3601db3f387f96a8a6b34c38a12",
          "body": "* feat/jq: add jq filter option\n\n* feat/jq-arg: implement code review design feedbacks\n\n* feat/jq-arg: add --jsonpath as alias of --jq\n\n* chore: run go mod tidy\n\n* feat/jq-arg: handle agentMode with metadata\n\n* feat/jq-arg: implement review feedbacks: remove --jsonpath alias and replace literal by jqFilter variable",
          "is_bot": false,
          "headline": "feat/jq: add jq filter option (#271)",
          "author_name": "Idriss Neumann",
          "author_login": "idrissneumann",
          "committed_at": "2026-06-12T13:58:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5a984b14daf2320d5bafb23ab96282e0d214c41b",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.29.0 changelog",
          "author_name": "Christoph Neumueller",
          "author_login": "discostu105",
          "committed_at": "2026-06-11T15:44:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eaf4cf1ed4da46056de92d532b4d7f65e514cf47",
          "body": "…(#274)\n\nWorkflows without an event or schedule trigger (manual trigger) serialize\nwith no \"trigger\" field, since Trigger is nil and marked omitempty. The apply\nresource-type heuristic required both \"tasks\" and \"trigger\", so the output of\n`dtctl get workflow -o yaml|json` for a manual workflow could\n[…]\nd alone, which is the defining workflow\nfield and is not used as a top-level key by any other resource type. Affects\nboth JSON and YAML output.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(workflow): workflows with manual triggers are detected correctly …",
          "author_name": "Christoph Bonitz",
          "author_login": "chbo-dt",
          "committed_at": "2026-06-11T12:09:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6d5f25a60ea3f726bed14b71d92b7014cf4c5198",
          "body": "…… (#264)\n\n* feat(azure): add clientSecret credential flags to create/update connection\n\n- dtctl create azure connection now accepts --directoryId, --applicationId,\n  --clientSecret flags for clientSecret type (full one-command setup)\n- dtctl update azure connection now accepts --clientSecret for se\n[…]\ny: Pawel Siwek <pawel.siwek@dynatrace.com>\n\n---------\n\nSigned-off-by: Pawel Siwek <pawel.siwek@dynatrace.com>\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(azure): add clientSecret credential flags to create/update conne…",
          "author_name": "Pawel Siwek",
          "author_login": "pawelsiwek",
          "committed_at": "2026-06-11T09:26:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b5ded1d9d5bdb283aef4bc6a49fac1960df23e1e",
          "body": null,
          "is_bot": false,
          "headline": "feat: better workflow and workflow list (#269)",
          "author_name": "Christoph Bonitz",
          "author_login": "chbo-dt",
          "committed_at": "2026-06-11T09:22:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3125b3edaf3014200d079ee7f8f902fd26945916",
          "body": null,
          "is_bot": false,
          "headline": "fix: enforce live debugger filters (#270)",
          "author_name": "Dudi Cohen",
          "author_login": "ElDuderinos",
          "committed_at": "2026-06-11T09:20:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d84c5231a873dbedde12683239ecc3b7cf227b47",
          "body": "…fig (#268)\n\n* fix(config): don't honor aliases/hooks from auto-discovered local config\n\nA per-project .dtctl.yaml is auto-discovered by walking up from the current\nworking directory, which means it can come from an untrusted location (a\nchecked-out repo, an unpacked tarball, a shared work dir, a CI\n[…]\n\nskip exec keys when IsLocal(). Values round-trip through save intact.\n\nRename StrippedExecKeys() -> IgnoredExecKeys() to match. Add a\nround-trip regression test and a resolver test for local aliases.",
          "is_bot": false,
          "headline": "fix(config): don't honor aliases/hooks from auto-discovered local con…",
          "author_name": "Christoph Neumüller",
          "author_login": "discostu105",
          "committed_at": "2026-06-11T09:19:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "13df04348e67d8d339cc3190a81e9633d18d7407",
          "body": "…s (#266)\n\nGO-2025-3749 (textproto ReadMIMEHeader) and GO-2026-5037 (crypto/x509\nhostname parsing) are fixed in Go 1.26.4. Updates go.mod and all CI\nworkflow files.",
          "is_bot": false,
          "headline": "fix(ci): bump Go toolchain to 1.26.4 to resolve stdlib vulnerabilitie…",
          "author_name": "Christoph Neumüller",
          "author_login": "discostu105",
          "committed_at": "2026-06-09T19:40:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c99c7f9ad7e2f185d63297ca8bc4057ae478979c",
          "body": "…tlptracehttp from 1.43.0 to 1.44.0 (#262)\n\n* chore(deps): bump go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp\n\nBumps [go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp](https://github.com/open-telemetry/opentelemetry-go) from 1.43.0 to 1.44.0.\n- [Release notes](https:\n[…]\nndabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>\nCo-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump go.opentelemetry.io/otel/exporters/otlp/otlptrace/o…",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-09T19:33:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e55e5dc46598545f26487ff1a2a97e72a59a2cfa",
          "body": "…(#260)\n\nBumps [go.opentelemetry.io/otel/sdk](https://github.com/open-telemetry/opentelemetry-go) from 1.43.0 to 1.44.0.\n- [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases)\n- [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md)\n- [Commits]\n[…]\nirect:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump go.opentelemetry.io/otel/sdk from 1.43.0 to 1.44.0 …",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-01T11:51:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e4d10257f90b6527419290a3aeae67736212561f",
          "body": "…0 (#261)\n\nBumps [go.opentelemetry.io/otel/trace](https://github.com/open-telemetry/opentelemetry-go) from 1.43.0 to 1.44.0.\n- [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases)\n- [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md)\n- [Comm\n[…]\nirect:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump go.opentelemetry.io/otel/trace from 1.43.0 to 1.44.…",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-05-31T18:08:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b6b06f065db469d3c1ac1d78fb05a86797a407cc",
          "body": "Bumps [go.opentelemetry.io/otel](https://github.com/open-telemetry/opentelemetry-go) from 1.43.0 to 1.44.0.\n- [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases)\n- [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md)\n- [Commits](https://gith\n[…]\nirect:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump go.opentelemetry.io/otel from 1.43.0 to 1.44.0 (#263)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-05-31T18:08:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "acf62bd529b25a5304a72c852b087146c21e3189",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.28.1 changelog",
          "author_name": "Christoph Neumueller",
          "author_login": "discostu105",
          "committed_at": "2026-05-29T21:50:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cad2e0e755d068b31844a9fa827161c93afcd9bb",
          "body": "…ctid present (#258)\n\ndryRun() was checking doc[\"id\"] to decide between ActionCreated and\nActionUpdated. Settings objects never carry an \"id\" field — they use\nobjectId (camelCase, API format) or objectid (lowercase, YAML round-trip\nformat) — so dry-run always reported \"created\" regardless of whether\n[…]\ntId/objectid so dry-run agrees\nwith actual apply.\n\nAdds regression tests:\n  TestApply_Settings_DryRun_WithObjectID_ReportsUpdated\n  TestApply_Settings_DryRun_WithoutObjectID_ReportsCreated\n\nFixes #256",
          "is_bot": false,
          "headline": "fix(apply/settings): dry-run now reports 'updated' when objectId/obje…",
          "author_name": "Christoph Neumüller",
          "author_login": "discostu105",
          "committed_at": "2026-05-29T21:49:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f32086c2541c2b9491d7e39c06fd87209778a099",
          "body": "… (#257)\n\nThe --id CLI flag injects doc[\"id\"] via injectID(), but applySettings\nwas only reading objectId/objectid — never id — to decide whether to PUT\nor POST. Every invocation with --id still sent a POST (CREATE) to the DT\nSettings API, returning 400 for any object whose identifier already existe\n[…]\n[\"id\"] as a final fallback in the objectID resolution chain\nin applySettings, so the value injected by --id is honoured.\n\nAdds regression test TestApply_Settings_OverrideID_TriggersUpdate.\n\nFixes #255",
          "is_bot": false,
          "headline": "fix(apply/settings): --id flag and --write-id --id now trigger UPDATE…",
          "author_name": "Christoph Neumüller",
          "author_login": "discostu105",
          "committed_at": "2026-05-29T19:35:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "25782e10e9a3700dae6b8b6bce8d5fd6366bd6ce",
          "body": "Previously, `dtctl ctx set <name>` only set the context as current when\nit was the very first context or no current context was set. With multiple\nexisting contexts, the command would report success (\"Context set\") but\nleave the current context unchanged — confusing users who expected the\nnamed cont\n[…]\netween create and update to make the outcome unambiguous:\n  - \"Context %q created and set as current\"\n  - \"Context %q updated and set as current\"\n\nAdded a test case to cover the update-activates path.",
          "is_bot": false,
          "headline": "fix(ctx): ctx set always activates the configured context (#254)",
          "author_name": "Christoph Neumüller",
          "author_login": "discostu105",
          "committed_at": "2026-05-28T09:09:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8a2494f7f124948e178c1ba893d64ed2eb4116e9",
          "body": "dtctl doctor reported [OK] for environment URLs without an https://\nscheme, then immediately failed the connectivity check with\n\"unsupported protocol scheme\"\". The url pattern checker only\nvalidated domain patterns (live vs apps, etc.) but never verified\nthat a scheme was present at all.\n\nAdd an ear\n[…]\nstion right away.\nThis surfaces as a [WARN] in dtctl doctor with the exact fix command\ninstead of a confusing [OK] followed by a [FAIL].\n\nFixes: dtctl doctor gives misleading [OK] for scheme-less URLs",
          "is_bot": false,
          "headline": "fix(urls): detect missing https:// scheme in environment URL (#253)",
          "author_name": "Christoph Neumüller",
          "author_login": "discostu105",
          "committed_at": "2026-05-27T10:55:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9e914186f2a90a2f27c9c3098e6d9b0294f09622",
          "body": "…, OAuth refresh race fix\n\nHighlights:\n- Publish github.com/dynatrace-oss/dtctl/sdk as a separate Go module\n  (sdk/api, sdk/api/query, sdk/httpclient, sdk/credstore, sdk/auth,\n  sdk/agentmode, sdk/urls).\n- Full AWS provider support (connection + monitoring) with parity to\n  Azure/GCP and a least-pri\n[…]\ng list endpoints (AWS/Azure/GCP) now follow\n  nextPageKey instead of silently truncating to page 1.\n- Nix flake support, tablewriter v1.1.4 migration, x/net v0.54.0, plus\n  the usual dependency bumps.",
          "is_bot": false,
          "headline": "release v0.28.0: dt-cli-sdk module, AWS provider, workflow exec input…",
          "author_name": "Christoph Neumueller",
          "author_login": "discostu105",
          "committed_at": "2026-05-26T09:49:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3fe2972cff6f434cf93aa163049c7e40ea342064",
          "body": "The Dynatrace Settings API now reports a missing schema as\n\"Configuration schema ... does not exist\" rather than the older\n\"not found\" wording, while still returning HTTP 404. The test now\naccepts either phrasing (and falls back to the 404 status code) so\nupstream message drift no longer fails the integration suite.\n\nSame class of test-only fix as #238 (trash restore conflict).",
          "is_bot": false,
          "headline": "fix: update settings list invalid-schema error assertion (#252)",
          "author_name": "Christoph Neumüller",
          "author_login": "discostu105",
          "committed_at": "2026-05-26T09:42:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ab205d7f77ba6bb2e38ff0705259c2c4f20147e9",
          "body": "Adds a cross-process advisory flock(2) lock around OAuth refresh-token\nrotation on Unix so that concurrent dtctl processes serialise their\nrefresh calls instead of all racing on the same refresh_token and\ntriggering invalid_grant.\n\nAlso fixes a latent bug where medium-compact tokens (access_token\nst\n[…]\nialises same-process goroutines, matching the intra-process behaviour\nprovided by flock(2) on Unix. Cross-process serialisation on Windows is\na documented future improvement (LockFileEx).\n\nFixes #248.",
          "is_bot": false,
          "headline": "fix(auth): prevent concurrent OAuth refresh-token rotation race (#249)",
          "author_name": "Alessandro Ruzzon",
          "author_login": "aleruz-dt",
          "committed_at": "2026-05-26T09:20:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d8fd3b0893eff0ace338e64ba4c5c9caa2f3e2df",
          "body": "Set ExecuteRequest.PollingPromiseSeconds to a default of 5 in\nExecuteAndPoll so the Dynatrace query API auto-cancels abandoned\nqueries when the client does not follow up within the budget. dtctl\nre-polls immediately after each long-poll returns RUNNING, so the\nclient-side gap is microseconds and no \n[…]\neded. Added a\nregression test that pins the poll-to-poll gap at < 1s to catch any\nsleep or backoff being introduced into the loop.\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(query): send pollingPromiseSeconds on DQL query:execute (#250)",
          "author_name": "herwigmoser",
          "author_login": "herwigmoser",
          "committed_at": "2026-05-26T09:15:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4a9945e2ac8f2c863dddd5e776c26a65db81761c",
          "body": "Bumps [golang.org/x/sys](https://github.com/golang/sys) from 0.44.0 to 0.45.0.\n- [Commits](https://github.com/golang/sys/compare/v0.44.0...v0.45.0)\n\n---\nupdated-dependencies:\n- dependency-name: golang.org/x/sys\n  dependency-version: 0.45.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump golang.org/x/sys from 0.44.0 to 0.45.0 (#251)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-05-26T09:10:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ee1a2ee1833a80dcff861b4a2ca921fc16fc1773",
          "body": null,
          "is_bot": false,
          "headline": "feat(workflow): enable --wait for simple workflows (#247)",
          "author_name": "Christoph Bonitz",
          "author_login": "chbo-dt",
          "committed_at": "2026-05-26T09:08:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "44541a9d950716da975d4e5760a7951ba8555a43",
          "body": null,
          "is_bot": false,
          "headline": "fix(workflow): preserve definition fields in get output (#246)",
          "author_name": "Christoph Bonitz",
          "author_login": "chbo-dt",
          "committed_at": "2026-05-26T09:08:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ecb1948eafda64c08c036fff810ecfc186367925",
          "body": "* feat(aws): add AWS provider support - connections + monitoring\n\nWIP: Full CRUD for AWS connections and monitoring configurations,\nsymmetric with existing Azure/GCP providers.\n\nNew packages:\n- pkg/resources/awsconnection: Settings 2.0 based connection management\n- pkg/resources/awsmonitoringconfig:\n[…]\nocs/cloud-integrations.md: new AWS section above Azure plus AWS added to the intro paragraph, covering the same 7-step onboarding flow.\n\nAddresses review feedback on PR #240 (no docs updates for AWS).",
          "is_bot": false,
          "headline": "feat(aws): add AWS provider support - connections + monitoring (#240)",
          "author_name": "Pawel Siwek",
          "author_login": "pawelsiwek",
          "committed_at": "2026-05-21T21:58:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f9ff1e986b4155d56b67f7f5a9ffa7ec593ef642",
          "body": "…ntity.* queries (#245)",
          "is_bot": false,
          "headline": "docs: update DQL reference to prefer smartscapeNodes over legacy dt.e…",
          "author_name": "franzpdt",
          "author_login": "franzpdt",
          "committed_at": "2026-05-19T08:21:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1094a79a79db6e72b67935b363f1115198fe4d45",
          "body": "Signed-off-by: Christoph Neumüller <christoph.neumueller@dynatrace.com>",
          "is_bot": false,
          "headline": "Update README.md",
          "author_name": "Christoph Neumüller",
          "author_login": "discostu105",
          "committed_at": "2026-05-19T05:20:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b2b82ec6e163b7fe06f468e70ac837b6f0ec363d",
          "body": null,
          "is_bot": false,
          "headline": "docs(sdk): add missing api/query package to README",
          "author_name": "Christoph Neumueller",
          "author_login": "discostu105",
          "committed_at": "2026-05-16T08:59:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6759ba9d3d850e08d6b8660c8424a5270f367d61",
          "body": "Bumps [github.com/spf13/cobra](https://github.com/spf13/cobra) from 1.8.0 to 1.10.2.\n- [Release notes](https://github.com/spf13/cobra/releases)\n- [Commits](https://github.com/spf13/cobra/compare/v1.8.0...v1.10.2)\n\n---\nupdated-dependencies:\n- dependency-name: github.com/spf13/cobra\n  dependency-versi\n[…]\nf-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>\nCo-authored-by: Christoph Neumueller <christoph.neumueller@dynatrace.com>",
          "is_bot": true,
          "headline": "chore(deps): bump github.com/spf13/cobra from 1.8.0 to 1.10.2 (#243)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-05-16T08:51:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d4fef7ad9e55eea6f4abf8672baf6afc34ffe21e",
          "body": "…0 (#242)\n\nBumps [github.com/guptarohit/asciigraph](https://github.com/guptarohit/asciigraph) from 0.7.3 to 0.9.0.\n- [Release notes](https://github.com/guptarohit/asciigraph/releases)\n- [Changelog](https://github.com/guptarohit/asciigraph/blob/master/CHANGELOG.md)\n- [Commits](https://github.com/gupt\n[…]\nf-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>\nCo-authored-by: Christoph Neumueller <christoph.neumueller@dynatrace.com>",
          "is_bot": true,
          "headline": "chore(deps): bump github.com/guptarohit/asciigraph from 0.7.3 to 0.9.…",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-05-16T08:50:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "76735be55bb016fcb3e8c60fff19566b4f545b3f",
          "body": null,
          "is_bot": false,
          "headline": "chore(sdk): release v0.2.0",
          "author_name": "Christoph Neumueller",
          "author_login": "discostu105",
          "committed_at": "2026-05-16T08:49:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1c4aa4792adfdfb4cda78d5c0a95675a7038594b",
          "body": "* feat(sdk): extract DQL query API into sdk/api/query/\n\nAdd a new SDK package for the Dynatrace DQL Query API\n(/platform/storage/query/v1/) with typed Execute, Poll, Cancel, and\nVerify methods, plus an ExecuteAndPoll convenience that handles async\npolling, context cancellation with backend cancel, a\n[…]\n the SDK applies the returned\ntoken via SetToken, making the contract reliable for all consumers.\n\nAlso replace the unreachable fallthrough return in Execute with an\nerror for unexpected status codes.",
          "is_bot": false,
          "headline": "feat(sdk): extract DQL query API into sdk/api/query/ (#241)",
          "author_name": "Christoph Neumüller",
          "author_login": "discostu105",
          "committed_at": "2026-05-16T08:42:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        }
      ],
      "releases_count": 59,
      "commits_last_year": 619,
      "latest_release_at": "2026-07-21T14:53:14Z",
      "latest_release_tag": "v0.35.0",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 27,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 3.9
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 87,
      "has_issue_template": false,
      "has_code_of_conduct": true,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/dynatrace-oss/dtctl",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/dynatrace-oss/dtctl",
          "is_deprecated": false,
          "latest_version": "v0.35.0",
          "repository_url": "https://github.com/dynatrace-oss/dtctl",
          "versions_count": 59,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-21T14:52:40Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        },
        {
          "name": "github.com/dynatrace-oss/dtctl/sdk",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/dynatrace-oss/dtctl/sdk",
          "is_deprecated": false,
          "latest_version": "v0.2.0",
          "repository_url": "https://github.com/dynatrace-oss/dtctl",
          "versions_count": 2,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-05-16T08:49:37Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 66
        }
      ]
    },
    "popularity": {
      "forks": 58,
      "stars": 168,
      "watchers": 6,
      "fork_history": {
        "days": [
          {
            "date": "2026-01-14",
            "count": 1
          },
          {
            "date": "2026-01-15",
            "count": 1
          },
          {
            "date": "2026-01-17",
            "count": 1
          },
          {
            "date": "2026-01-19",
            "count": 1
          },
          {
            "date": "2026-02-03",
            "count": 1
          },
          {
            "date": "2026-02-16",
            "count": 1
          },
          {
            "date": "2026-02-17",
            "count": 2
          },
          {
            "date": "2026-02-20",
            "count": 1
          },
          {
            "date": "2026-03-03",
            "count": 1
          },
          {
            "date": "2026-03-07",
            "count": 1
          },
          {
            "date": "2026-03-09",
            "count": 2
          },
          {
            "date": "2026-03-10",
            "count": 2
          },
          {
            "date": "2026-03-18",
            "count": 1
          },
          {
            "date": "2026-03-26",
            "count": 2
          },
          {
            "date": "2026-03-27",
            "count": 1
          },
          {
            "date": "2026-03-30",
            "count": 2
          },
          {
            "date": "2026-03-31",
            "count": 3
          },
          {
            "date": "2026-04-07",
            "count": 1
          },
          {
            "date": "2026-04-09",
            "count": 1
          },
          {
            "date": "2026-04-15",
            "count": 1
          },
          {
            "date": "2026-04-18",
            "count": 2
          },
          {
            "date": "2026-04-20",
            "count": 1
          },
          {
            "date": "2026-04-21",
            "count": 1
          },
          {
            "date": "2026-04-23",
            "count": 1
          },
          {
            "date": "2026-04-25",
            "count": 1
          },
          {
            "date": "2026-04-27",
            "count": 1
          },
          {
            "date": "2026-04-29",
            "count": 2
          },
          {
            "date": "2026-04-30",
            "count": 1
          },
          {
            "date": "2026-05-11",
            "count": 1
          },
          {
            "date": "2026-05-12",
            "count": 1
          },
          {
            "date": "2026-05-13",
            "count": 1
          },
          {
            "date": "2026-05-19",
            "count": 1
          },
          {
            "date": "2026-05-20",
            "count": 1
          },
          {
            "date": "2026-06-06",
            "count": 1
          },
          {
            "date": "2026-06-08",
            "count": 2
          },
          {
            "date": "2026-06-09",
            "count": 1
          },
          {
            "date": "2026-06-10",
            "count": 1
          },
          {
            "date": "2026-06-15",
            "count": 1
          },
          {
            "date": "2026-06-16",
            "count": 1
          },
          {
            "date": "2026-06-17",
            "count": 1
          },
          {
            "date": "2026-06-24",
            "count": 1
          },
          {
            "date": "2026-06-26",
            "count": 1
          },
          {
            "date": "2026-06-28",
            "count": 1
          },
          {
            "date": "2026-06-30",
            "count": 1
          },
          {
            "date": "2026-07-01",
            "count": 1
          },
          {
            "date": "2026-07-05",
            "count": 1
          },
          {
            "date": "2026-07-06",
            "count": 1
          },
          {
            "date": "2026-07-09",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 58,
        "total_forks": 58
      },
      "star_history": {
        "days": [
          {
            "date": "2026-01-09",
            "count": 1
          },
          {
            "date": "2026-01-12",
            "count": 1
          },
          {
            "date": "2026-01-13",
            "count": 8
          },
          {
            "date": "2026-01-14",
            "count": 19
          },
          {
            "date": "2026-01-15",
            "count": 3
          },
          {
            "date": "2026-01-17",
            "count": 1
          },
          {
            "date": "2026-01-18",
            "count": 4
          },
          {
            "date": "2026-01-19",
            "count": 5
          },
          {
            "date": "2026-01-20",
            "count": 1
          },
          {
            "date": "2026-01-21",
            "count": 1
          },
          {
            "date": "2026-01-23",
            "count": 1
          },
          {
            "date": "2026-01-24",
            "count": 1
          },
          {
            "date": "2026-01-26",
            "count": 3
          },
          {
            "date": "2026-01-28",
            "count": 1
          },
          {
            "date": "2026-02-04",
            "count": 1
          },
          {
            "date": "2026-02-06",
            "count": 3
          },
          {
            "date": "2026-02-08",
            "count": 1
          },
          {
            "date": "2026-02-09",
            "count": 1
          },
          {
            "date": "2026-02-13",
            "count": 1
          },
          {
            "date": "2026-02-16",
            "count": 1
          },
          {
            "date": "2026-02-18",
            "count": 1
          },
          {
            "date": "2026-02-19",
            "count": 1
          },
          {
            "date": "2026-02-24",
            "count": 1
          },
          {
            "date": "2026-02-25",
            "count": 2
          },
          {
            "date": "2026-02-28",
            "count": 1
          },
          {
            "date": "2026-03-02",
            "count": 1
          },
          {
            "date": "2026-03-03",
            "count": 2
          },
          {
            "date": "2026-03-04",
            "count": 1
          },
          {
            "date": "2026-03-05",
            "count": 1
          },
          {
            "date": "2026-03-06",
            "count": 3
          },
          {
            "date": "2026-03-09",
            "count": 1
          },
          {
            "date": "2026-03-10",
            "count": 2
          },
          {
            "date": "2026-03-11",
            "count": 1
          },
          {
            "date": "2026-03-12",
            "count": 1
          },
          {
            "date": "2026-03-13",
            "count": 3
          },
          {
            "date": "2026-03-16",
            "count": 3
          },
          {
            "date": "2026-03-17",
            "count": 1
          },
          {
            "date": "2026-03-18",
            "count": 1
          },
          {
            "date": "2026-03-19",
            "count": 2
          },
          {
            "date": "2026-03-20",
            "count": 1
          },
          {
            "date": "2026-03-24",
            "count": 5
          },
          {
            "date": "2026-03-25",
            "count": 2
          },
          {
            "date": "2026-03-26",
            "count": 1
          },
          {
            "date": "2026-03-27",
            "count": 2
          },
          {
            "date": "2026-03-28",
            "count": 2
          },
          {
            "date": "2026-03-30",
            "count": 4
          },
          {
            "date": "2026-03-31",
            "count": 1
          },
          {
            "date": "2026-04-01",
            "count": 1
          },
          {
            "date": "2026-04-03",
            "count": 3
          },
          {
            "date": "2026-04-05",
            "count": 1
          },
          {
            "date": "2026-04-07",
            "count": 3
          },
          {
            "date": "2026-04-08",
            "count": 3
          },
          {
            "date": "2026-04-10",
            "count": 3
          },
          {
            "date": "2026-04-11",
            "count": 1
          },
          {
            "date": "2026-04-14",
            "count": 1
          },
          {
            "date": "2026-04-16",
            "count": 2
          },
          {
            "date": "2026-04-20",
            "count": 1
          },
          {
            "date": "2026-04-25",
            "count": 1
          },
          {
            "date": "2026-04-27",
            "count": 1
          },
          {
            "date": "2026-04-28",
            "count": 1
          },
          {
            "date": "2026-04-30",
            "count": 1
          },
          {
            "date": "2026-05-04",
            "count": 1
          },
          {
            "date": "2026-05-06",
            "count": 1
          },
          {
            "date": "2026-05-07",
            "count": 1
          },
          {
            "date": "2026-05-08",
            "count": 1
          },
          {
            "date": "2026-05-13",
            "count": 1
          },
          {
            "date": "2026-05-18",
            "count": 3
          },
          {
            "date": "2026-05-20",
            "count": 2
          },
          {
            "date": "2026-05-21",
            "count": 1
          },
          {
            "date": "2026-05-25",
            "count": 1
          },
          {
            "date": "2026-05-27",
            "count": 1
          },
          {
            "date": "2026-06-02",
            "count": 1
          },
          {
            "date": "2026-06-03",
            "count": 1
          },
          {
            "date": "2026-06-04",
            "count": 2
          },
          {
            "date": "2026-06-05",
            "count": 1
          },
          {
            "date": "2026-06-11",
            "count": 1
          },
          {
            "date": "2026-06-12",
            "count": 1
          },
          {
            "date": "2026-06-15",
            "count": 2
          },
          {
            "date": "2026-06-16",
            "count": 3
          },
          {
            "date": "2026-06-17",
            "count": 1
          },
          {
            "date": "2026-06-21",
            "count": 1
          },
          {
            "date": "2026-06-25",
            "count": 1
          },
          {
            "date": "2026-06-26",
            "count": 1
          },
          {
            "date": "2026-06-27",
            "count": 1
          },
          {
            "date": "2026-06-29",
            "count": 1
          },
          {
            "date": "2026-06-30",
            "count": 1
          },
          {
            "date": "2026-07-03",
            "count": 2
          },
          {
            "date": "2026-07-04",
            "count": 1
          },
          {
            "date": "2026-07-07",
            "count": 1
          },
          {
            "date": "2026-07-08",
            "count": 1
          },
          {
            "date": "2026-07-09",
            "count": 1
          },
          {
            "date": "2026-07-13",
            "count": 1
          },
          {
            "date": "2026-07-15",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 168,
        "total_stars": 168
      },
      "open_issues_and_prs": 22
    },
    "ai_readiness": {
      "has_nix": true,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": true,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "go.mod",
        "sdk/go.mod"
      ],
      "largest_source_bytes": 112576,
      "source_files_sampled": 580,
      "oversized_source_files": 6,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 17569
    },
    "dependencies": {
      "manifests": [
        "go.mod",
        "sdk/go.mod"
      ],
      "advisories": {
        "error": null,
        "scope": "repository_graph",
        "source": "osv",
        "findings": [
          {
            "name": "kramdown",
            "direct": false,
            "version": "1.14.0",
            "severity": "critical",
            "ecosystem": "rubygems",
            "cvss_score": 9.8,
            "advisory_ids": [
              "GHSA-mqm2-cgpr-p4m6"
            ],
            "fixed_version": "2.3.0",
            "advisory_count": 1,
            "oldest_advisory_days": 2173
          },
          {
            "name": "activesupport",
            "direct": false,
            "version": "4.2.9",
            "severity": "high",
            "ecosystem": "rubygems",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-2j26-frm8-cmj9",
              "GHSA-89vf-4333-qx8v",
              "GHSA-cg4j-q9v8-6v38",
              "GHSA-j6gc-792m-qgm2",
              "GHSA-pj73-v5mw-pm9j"
            ],
            "fixed_version": "8.1.2.1",
            "advisory_count": 5,
            "oldest_advisory_days": 1280
          },
          {
            "name": "jekyll",
            "direct": false,
            "version": "3.6.2",
            "severity": "high",
            "ecosystem": "rubygems",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-4xjh-m3qx-49wc"
            ],
            "fixed_version": "3.8.4",
            "advisory_count": 1,
            "oldest_advisory_days": 2853
          },
          {
            "name": "golang.org/x/net",
            "direct": false,
            "version": "v0.55.0",
            "severity": "unknown",
            "ecosystem": "go",
            "cvss_score": null,
            "advisory_ids": [
              "GO-2026-5942"
            ],
            "fixed_version": "0.56.0",
            "advisory_count": 1,
            "oldest_advisory_days": 7
          }
        ],
        "collected": true,
        "truncated": false,
        "by_severity": {
          "high": 2,
          "unknown": 1,
          "critical": 1
        },
        "advisory_count": 8,
        "affected_count": 4,
        "assessed_count": 151,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "go"
      ],
      "dependencies": [
        {
          "name": "github.com/adrg/xdg",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.5.3"
        },
        {
          "name": "github.com/dynatrace-oss/dtctl/sdk",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0-00010101000000-000000000000"
        },
        {
          "name": "github.com/go-resty/resty/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.17.2"
        },
        {
          "name": "github.com/google/shlex",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0-20191202100458-e7afc7fbc510"
        },
        {
          "name": "github.com/guptarohit/asciigraph",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.10.0"
        },
        {
          "name": "github.com/itchyny/gojq",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.12.19"
        },
        {
          "name": "github.com/olekukonko/tablewriter",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.1.4"
        },
        {
          "name": "github.com/parquet-go/parquet-go",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.30.1"
        },
        {
          "name": "github.com/spf13/cobra",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.10.2"
        },
        {
          "name": "github.com/spf13/pflag",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.0.10"
        },
        {
          "name": "github.com/spf13/viper",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.21.0"
        },
        {
          "name": "github.com/stretchr/testify",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.11.1"
        },
        {
          "name": "github.com/toon-format/toon-go",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0-20251202084852-7ca0e27c4e8c"
        },
        {
          "name": "go.opentelemetry.io/otel",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.44.0"
        },
        {
          "name": "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.44.0"
        },
        {
          "name": "go.opentelemetry.io/otel/sdk",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.44.0"
        },
        {
          "name": "go.opentelemetry.io/otel/trace",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.44.0"
        },
        {
          "name": "golang.org/x/sys",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.47.0"
        },
        {
          "name": "golang.org/x/term",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.45.0"
        },
        {
          "name": "golang.org/x/text",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.40.0"
        },
        {
          "name": "google.golang.org/protobuf",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.36.11"
        },
        {
          "name": "gopkg.in/yaml.v3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.0.1"
        },
        {
          "name": "github.com/adrg/xdg",
          "manifest": "sdk/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.5.3"
        },
        {
          "name": "github.com/go-resty/resty/v2",
          "manifest": "sdk/go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.17.2"
        },
        {
          "name": "github.com/godbus/dbus/v5",
          "manifest": "sdk/go.mod",
          "ecosystem": "go",
          "version_constraint": "v5.2.2"
        },
        {
          "name": "github.com/pkg/browser",
          "manifest": "sdk/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0-20240102092130-5ac0b6a4141c"
        },
        {
          "name": "github.com/stretchr/testify",
          "manifest": "sdk/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.11.1"
        },
        {
          "name": "github.com/zalando/go-keyring",
          "manifest": "sdk/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.2.8"
        },
        {
          "name": "golang.org/x/sys",
          "manifest": "sdk/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.47.0"
        },
        {
          "name": "gopkg.in/yaml.v3",
          "manifest": "sdk/go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.0.1"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "github.com/adrg/xdg",
            "direct": true,
            "version": "v0.5.3",
            "ecosystem": "go"
          },
          {
            "name": "github.com/go-resty/resty/v2",
            "direct": true,
            "version": "v2.17.2",
            "ecosystem": "go"
          },
          {
            "name": "github.com/godbus/dbus/v5",
            "direct": true,
            "version": "v5.2.2",
            "ecosystem": "go"
          },
          {
            "name": "github.com/google/shlex",
            "direct": true,
            "version": "v0.0.0-20191202100458-e7afc7fbc510",
            "ecosystem": "go"
          },
          {
            "name": "github.com/guptarohit/asciigraph",
            "direct": true,
            "version": "v0.10.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/itchyny/gojq",
            "direct": true,
            "version": "v0.12.19",
            "ecosystem": "go"
          },
          {
            "name": "github.com/olekukonko/tablewriter",
            "direct": true,
            "version": "v1.1.4",
            "ecosystem": "go"
          },
          {
            "name": "github.com/parquet-go/parquet-go",
            "direct": true,
            "version": "v0.30.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/pkg/browser",
            "direct": true,
            "version": "v0.0.0-20240102092130-5ac0b6a4141c",
            "ecosystem": "go"
          },
          {
            "name": "github.com/spf13/cobra",
            "direct": true,
            "version": "v1.10.2",
            "ecosystem": "go"
          },
          {
            "name": "github.com/spf13/pflag",
            "direct": true,
            "version": "v1.0.10",
            "ecosystem": "go"
          },
          {
            "name": "github.com/spf13/viper",
            "direct": true,
            "version": "v1.21.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/stretchr/testify",
            "direct": true,
            "version": "v1.11.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/toon-format/toon-go",
            "direct": true,
            "version": "v0.0.0-20251202084852-7ca0e27c4e8c",
            "ecosystem": "go"
          },
          {
            "name": "github.com/zalando/go-keyring",
            "direct": true,
            "version": "v0.2.8",
            "ecosystem": "go"
          },
          {
            "name": "go.opentelemetry.io/otel",
            "direct": true,
            "version": "v1.44.0",
            "ecosystem": "go"
          },
          {
            "name": "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp",
            "direct": true,
            "version": "v1.44.0",
            "ecosystem": "go"
          },
          {
            "name": "go.opentelemetry.io/otel/sdk",
            "direct": true,
            "version": "v1.44.0",
            "ecosystem": "go"
          },
          {
            "name": "go.opentelemetry.io/otel/trace",
            "direct": true,
            "version": "v1.44.0",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/sys",
            "direct": true,
            "version": "v0.47.0",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/term",
            "direct": true,
            "version": "v0.45.0",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/text",
            "direct": true,
            "version": "v0.40.0",
            "ecosystem": "go"
          },
          {
            "name": "google.golang.org/protobuf",
            "direct": true,
            "version": "v1.36.11",
            "ecosystem": "go"
          },
          {
            "name": "gopkg.in/yaml.v3",
            "direct": true,
            "version": "v3.0.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/andybalholm/brotli",
            "direct": false,
            "version": "v1.1.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/cenkalti/backoff/v5",
            "direct": false,
            "version": "v5.0.3",
            "ecosystem": "go"
          },
          {
            "name": "github.com/cespare/xxhash/v2",
            "direct": false,
            "version": "v2.3.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/clipperhouse/displaywidth",
            "direct": false,
            "version": "v0.10.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/clipperhouse/uax29/v2",
            "direct": false,
            "version": "v2.6.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/danieljoos/wincred",
            "direct": false,
            "version": "v1.2.3",
            "ecosystem": "go"
          },
          {
            "name": "github.com/davecgh/go-spew",
            "direct": false,
            "version": "v1.1.2-0.20180830191138-d8f796af33cc",
            "ecosystem": "go"
          },
          {
            "name": "github.com/fatih/color",
            "direct": false,
            "version": "v1.18.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/fsnotify/fsnotify",
            "direct": false,
            "version": "v1.9.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/go-logr/logr",
            "direct": false,
            "version": "v1.4.3",
            "ecosystem": "go"
          },
          {
            "name": "github.com/go-logr/stdr",
            "direct": false,
            "version": "v1.2.2",
            "ecosystem": "go"
          },
          {
            "name": "github.com/go-viper/mapstructure/v2",
            "direct": false,
            "version": "v2.4.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/google/uuid",
            "direct": false,
            "version": "v1.6.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/grpc-ecosystem/grpc-gateway/v2",
            "direct": false,
            "version": "v2.29.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/inconshreveable/mousetrap",
            "direct": false,
            "version": "v1.1.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/itchyny/timefmt-go",
            "direct": false,
            "version": "v0.1.8",
            "ecosystem": "go"
          },
          {
            "name": "github.com/klauspost/compress",
            "direct": false,
            "version": "v1.17.9",
            "ecosystem": "go"
          },
          {
            "name": "github.com/kr/pretty",
            "direct": false,
            "version": "v0.3.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/mattn/go-colorable",
            "direct": false,
            "version": "v0.1.14",
            "ecosystem": "go"
          },
          {
            "name": "github.com/mattn/go-isatty",
            "direct": false,
            "version": "v0.0.20",
            "ecosystem": "go"
          },
          {
            "name": "github.com/mattn/go-runewidth",
            "direct": false,
            "version": "v0.0.19",
            "ecosystem": "go"
          },
          {
            "name": "github.com/olekukonko/cat",
            "direct": false,
            "version": "v0.0.0-20250911104152-50322a0618f6",
            "ecosystem": "go"
          },
          {
            "name": "github.com/olekukonko/errors",
            "direct": false,
            "version": "v1.2.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/olekukonko/ll",
            "direct": false,
            "version": "v0.1.6",
            "ecosystem": "go"
          },
          {
            "name": "github.com/parquet-go/bitpack",
            "direct": false,
            "version": "v1.0.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/parquet-go/jsonlite",
            "direct": false,
            "version": "v1.0.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/pelletier/go-toml/v2",
            "direct": false,
            "version": "v2.2.4",
            "ecosystem": "go"
          },
          {
            "name": "github.com/pierrec/lz4/v4",
            "direct": false,
            "version": "v4.1.21",
            "ecosystem": "go"
          },
          {
            "name": "github.com/pmezard/go-difflib",
            "direct": false,
            "version": "v1.0.1-0.20181226105442-5d4384ee4fb2",
            "ecosystem": "go"
          },
          {
            "name": "github.com/rogpeppe/go-internal",
            "direct": false,
            "version": "v1.14.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagikazarmark/locafero",
            "direct": false,
            "version": "v0.11.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sourcegraph/conc",
            "direct": false,
            "version": "v0.3.1-0.20240121214520-5f936abd7ae8",
            "ecosystem": "go"
          },
          {
            "name": "github.com/spf13/afero",
            "direct": false,
            "version": "v1.15.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/spf13/cast",
            "direct": false,
            "version": "v1.10.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/subosito/gotenv",
            "direct": false,
            "version": "v1.6.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/twpayne/go-geom",
            "direct": false,
            "version": "v1.6.1",
            "ecosystem": "go"
          },
          {
            "name": "go.opentelemetry.io/auto/sdk",
            "direct": false,
            "version": "v1.2.1",
            "ecosystem": "go"
          },
          {
            "name": "go.opentelemetry.io/otel/exporters/otlp/otlptrace",
            "direct": false,
            "version": "v1.44.0",
            "ecosystem": "go"
          },
          {
            "name": "go.opentelemetry.io/otel/metric",
            "direct": false,
            "version": "v1.44.0",
            "ecosystem": "go"
          },
          {
            "name": "go.opentelemetry.io/proto/otlp",
            "direct": false,
            "version": "v1.10.0",
            "ecosystem": "go"
          },
          {
            "name": "go.yaml.in/yaml/v3",
            "direct": false,
            "version": "v3.0.4",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/net",
            "direct": false,
            "version": "v0.55.0",
            "ecosystem": "go"
          },
          {
            "name": "google.golang.org/genproto/googleapis/api",
            "direct": false,
            "version": "v0.0.0-20260526163538-3dc84a4a5aaa",
            "ecosystem": "go"
          },
          {
            "name": "google.golang.org/genproto/googleapis/rpc",
            "direct": false,
            "version": "v0.0.0-20260526163538-3dc84a4a5aaa",
            "ecosystem": "go"
          },
          {
            "name": "google.golang.org/grpc",
            "direct": false,
            "version": "v1.81.1",
            "ecosystem": "go"
          },
          {
            "name": "gopkg.in/check.v1",
            "direct": false,
            "version": "v1.0.0-20201130134442-10cb98267c6c",
            "ecosystem": "go"
          },
          {
            "name": "activesupport",
            "direct": false,
            "version": "4.2.9",
            "ecosystem": "rubygems"
          },
          {
            "name": "addressable",
            "direct": false,
            "version": "2.9.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "coffee-script",
            "direct": false,
            "version": "2.4.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "coffee-script-source",
            "direct": false,
            "version": "1.11.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "colorator",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "concurrent-ruby",
            "direct": false,
            "version": "1.3.7",
            "ecosystem": "rubygems"
          },
          {
            "name": "ethon",
            "direct": false,
            "version": "0.18.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "execjs",
            "direct": false,
            "version": "2.10.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "faraday",
            "direct": false,
            "version": "2.14.3",
            "ecosystem": "rubygems"
          },
          {
            "name": "faraday-net_http",
            "direct": false,
            "version": "3.4.4",
            "ecosystem": "rubygems"
          },
          {
            "name": "ffi",
            "direct": false,
            "version": "1.17.4",
            "ecosystem": "rubygems"
          },
          {
            "name": "forwardable-extended",
            "direct": false,
            "version": "2.6.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "gemoji",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "github-pages",
            "direct": false,
            "version": "170",
            "ecosystem": "rubygems"
          },
          {
            "name": "github-pages-health-check",
            "direct": false,
            "version": "1.3.5",
            "ecosystem": "rubygems"
          },
          {
            "name": "html-pipeline",
            "direct": false,
            "version": "2.14.3",
            "ecosystem": "rubygems"
          },
          {
            "name": "i18n",
            "direct": false,
            "version": "0.9.5",
            "ecosystem": "rubygems"
          },
          {
            "name": "jekyll",
            "direct": false,
            "version": "3.6.2",
            "ecosystem": "rubygems"
          },
          {
            "name": "jekyll-avatar",
            "direct": false,
            "version": "0.5.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "jekyll-coffeescript",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "rubygems"
          },
          {
            "name": "jekyll-default-layout",
            "direct": false,
            "version": "0.1.4",
            "ecosystem": "rubygems"
          },
          {
            "name": "jekyll-feed",
            "direct": false,
            "version": "0.9.2",
            "ecosystem": "rubygems"
          },
          {
            "name": "jekyll-gist",
            "direct": false,
            "version": "1.4.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "jekyll-github-metadata",
            "direct": false,
            "version": "2.9.3",
            "ecosystem": "rubygems"
          },
          {
            "name": "jekyll-mentions",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "jekyll-optional-front-matter",
            "direct": false,
            "version": "0.3.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "jekyll-paginate",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "jekyll-readme-index",
            "direct": false,
            "version": "0.2.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "jekyll-redirect-from",
            "direct": false,
            "version": "0.12.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "jekyll-relative-links",
            "direct": false,
            "version": "0.5.2",
            "ecosystem": "rubygems"
          },
          {
            "name": "jekyll-remote-theme",
            "direct": false,
            "version": "0.5.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "jekyll-sass-converter",
            "direct": false,
            "version": "1.5.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "jekyll-seo-tag",
            "direct": false,
            "version": "2.3.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "jekyll-sitemap",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "jekyll-swiss",
            "direct": false,
            "version": "0.4.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "jekyll-theme-architect",
            "direct": false,
            "version": "0.1.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "jekyll-theme-cayman",
            "direct": false,
            "version": "0.1.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "jekyll-theme-dinky",
            "direct": false,
            "version": "0.1.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "jekyll-theme-hacker",
            "direct": false,
            "version": "0.1.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "jekyll-theme-leap-day",
            "direct": false,
            "version": "0.1.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "jekyll-theme-merlot",
            "direct": false,
            "version": "0.1.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "jekyll-theme-midnight",
            "direct": false,
            "version": "0.1.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "jekyll-theme-minimal",
            "direct": false,
            "version": "0.1.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "jekyll-theme-modernist",
            "direct": false,
            "version": "0.1.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "jekyll-theme-primer",
            "direct": false,
            "version": "0.5.2",
            "ecosystem": "rubygems"
          },
          {
            "name": "jekyll-theme-slate",
            "direct": false,
            "version": "0.1.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "jekyll-theme-tactile",
            "direct": false,
            "version": "0.1.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "jekyll-theme-time-machine",
            "direct": false,
            "version": "0.1.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "jekyll-titles-from-headings",
            "direct": false,
            "version": "0.5.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "jekyll-watch",
            "direct": false,
            "version": "1.5.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "jemoji",
            "direct": false,
            "version": "0.8.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "json",
            "direct": false,
            "version": "2.20.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "kramdown",
            "direct": false,
            "version": "1.14.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "liquid",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "listen",
            "direct": false,
            "version": "3.0.6",
            "ecosystem": "rubygems"
          },
          {
            "name": "logger",
            "direct": false,
            "version": "1.7.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "mercenary",
            "direct": false,
            "version": "0.3.6",
            "ecosystem": "rubygems"
          },
          {
            "name": "minima",
            "direct": false,
            "version": "2.1.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "minitest",
            "direct": false,
            "version": "5.27.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "net-dns",
            "direct": false,
            "version": "0.20.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "net-http",
            "direct": false,
            "version": "0.9.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "nokogiri",
            "direct": false,
            "version": "1.19.4",
            "ecosystem": "rubygems"
          },
          {
            "name": "octokit",
            "direct": false,
            "version": "4.25.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "openssl",
            "direct": false,
            "version": "4.0.2",
            "ecosystem": "rubygems"
          },
          {
            "name": "pathutil",
            "direct": false,
            "version": "0.16.2",
            "ecosystem": "rubygems"
          },
          {
            "name": "public_suffix",
            "direct": false,
            "version": "2.0.5",
            "ecosystem": "rubygems"
          },
          {
            "name": "racc",
            "direct": false,
            "version": "1.8.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "rb-fsevent",
            "direct": false,
            "version": "0.11.2",
            "ecosystem": "rubygems"
          },
          {
            "name": "rb-inotify",
            "direct": false,
            "version": "0.11.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "rouge",
            "direct": false,
            "version": "2.2.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "rubyzip",
            "direct": false,
            "version": "2.4.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "safe_yaml",
            "direct": false,
            "version": "1.0.5",
            "ecosystem": "rubygems"
          },
          {
            "name": "sass",
            "direct": false,
            "version": "3.7.4",
            "ecosystem": "rubygems"
          },
          {
            "name": "sass-listen",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "sawyer",
            "direct": false,
            "version": "0.9.3",
            "ecosystem": "rubygems"
          },
          {
            "name": "terminal-table",
            "direct": false,
            "version": "1.8.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "thread_safe",
            "direct": false,
            "version": "0.3.6",
            "ecosystem": "rubygems"
          },
          {
            "name": "typhoeus",
            "direct": false,
            "version": "0.8.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "tzinfo",
            "direct": false,
            "version": "1.2.11",
            "ecosystem": "rubygems"
          },
          {
            "name": "unicode-display_width",
            "direct": false,
            "version": "1.8.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "uri",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "rubygems"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 151,
        "direct_count": 24,
        "indirect_count": 127
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 7,
        "merged_prs": 250,
        "open_issues": 15,
        "closed_ratio": 0.812,
        "closed_issues": 65,
        "closed_unmerged_prs": 31
      },
      "bus_factor": 1,
      "bot_contributors": 3,
      "top_contributors": [
        {
          "type": "User",
          "login": "discostu105",
          "commits": 390,
          "avatar_url": "https://avatars.githubusercontent.com/u/10918780?v=4"
        },
        {
          "type": "User",
          "login": "ElDuderinos",
          "commits": 83,
          "avatar_url": "https://avatars.githubusercontent.com/u/31986166?v=4"
        },
        {
          "type": "User",
          "login": "pawelsiwek",
          "commits": 16,
          "avatar_url": "https://avatars.githubusercontent.com/u/26413843?v=4"
        },
        {
          "type": "User",
          "login": "MaciejGrynda",
          "commits": 16,
          "avatar_url": "https://avatars.githubusercontent.com/u/85988949?v=4"
        },
        {
          "type": "User",
          "login": "herwigmoser",
          "commits": 9,
          "avatar_url": "https://avatars.githubusercontent.com/u/16954394?v=4"
        },
        {
          "type": "User",
          "login": "beeme1mr",
          "commits": 7,
          "avatar_url": "https://avatars.githubusercontent.com/u/682996?v=4"
        },
        {
          "type": "User",
          "login": "mreider",
          "commits": 6,
          "avatar_url": "https://avatars.githubusercontent.com/u/118036?v=4"
        },
        {
          "type": "User",
          "login": "chbo-dt",
          "commits": 6,
          "avatar_url": "https://avatars.githubusercontent.com/u/137424235?v=4"
        },
        {
          "type": "User",
          "login": "christian-kreuzberger-dtx",
          "commits": 5,
          "avatar_url": "https://avatars.githubusercontent.com/u/56065213?v=4"
        },
        {
          "type": "User",
          "login": "alramlechner",
          "commits": 5,
          "avatar_url": "https://avatars.githubusercontent.com/u/8438592?v=4"
        }
      ],
      "contributors_sampled": 40,
      "top_contributor_share": 0.658
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "build.yml",
        "lint-docs-templates.yml",
        "lint.yml",
        "makefile.yml",
        "pages.yml",
        "release.yml",
        "sdk.yml",
        "security.yml",
        "test.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        ".golangci.yml"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "Gemfile.lock",
        "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": null,
            "reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 8,
            "reason": "26 out of 29 merged PRs checked by a CI test -- score normalized to 8",
            "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": 3,
            "reason": "Found 8/22 approved changesets -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 8 contributing companies or organizations",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 10,
            "reason": "update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 15 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": 10,
            "reason": "security policy file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 8,
            "reason": "5 out of the last 5 releases have a total of 5 signed artifacts.",
            "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": 2,
            "reason": "8 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "39d109fcfef90adfef19c0c5ec7c0bd41f0acfb0",
        "ran_at": "2026-07-21T21:05:03Z",
        "aggregate_score": 6.1,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": true,
      "has_dependabot_config": true
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/dynatrace-oss/dtctl",
    "host": "github.com",
    "name": "dtctl",
    "owner": "dynatrace-oss"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "good",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 77,
      "inputs": {
        "security": 69,
        "vitality": 89,
        "community": 72,
        "governance": 69,
        "engineering": 84
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 89,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 83,
            "inputs": {
              "commits_last_year": 619,
              "human_commit_share": 0.79,
              "days_since_last_push": 0,
              "active_weeks_last_year": 27
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "27/52 weeks with commits",
                "points": 18.7,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 27
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "619 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 619
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 15 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": 98,
            "inputs": {
              "releases_count": 59,
              "latest_release_tag": "v0.35.0",
              "releases_from_tags": false,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 3.9
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "59 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 59
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~3.9 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 3.9
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "5 out of the last 5 releases have a total of 5 signed artifacts.",
                "points": 8,
                "status": "partial",
                "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": 0,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 0 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "good",
        "name": "Community & Adoption",
        "value": 72,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "moderate",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "forks": 58,
              "stars": 168,
              "watchers": 6,
              "growth_state": "organic",
              "growth_factor_pct": 100
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "168 stars",
                "points": 36.1,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 168
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "58 forks",
                "points": 14.6,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 58
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "6 watchers",
                "points": 3.9,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 6
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "excellent",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": true,
              "has_pull_request_template": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (Apache-2.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "Apache-2.0"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 13.5,
                "status": "met",
                "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": 6.3,
                "status": "met",
                "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": 69,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 40,
              "top_contributor_share": 0.658
            },
            "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 66% of commits",
                "points": 7.7,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 66
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "40 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 40
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 8 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 76,
            "inputs": {
              "merged_prs": 250,
              "open_issues": 15,
              "closed_issues": 65,
              "issue_closed_ratio": 0.812,
              "closed_unmerged_prs": 31
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "81% of issues closed",
                "points": 38,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 81
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "250/281 decided PRs merged",
                "points": 34,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 250,
                      "decided": 281
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 8/22 approved changesets -- score normalized to 3",
                "points": 4.5,
                "status": "partial",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "good",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 72,
            "inputs": {
              "followers": 267,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "dynatrace-oss",
              "public_repos": 94,
              "account_age_days": 2430
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "267 followers of dynatrace-oss",
                "points": 17.5,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 267,
                      "login": "dynatrace-oss"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "94 public repos, account ~6 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 94
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 6
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/dynatrace-oss/dtctl",
                "github.com/dynatrace-oss/dtctl/sdk"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "2 package(s) on go",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 2,
                      "ecosystems": "go"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 0 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "59 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 59
                    }
                  }
                ],
                "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": 84,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 80,
            "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": "9 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 9
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": ".golangci.yml",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml"
                    }
                  }
                ],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "26 out of 29 merged PRs checked by a CI test -- score normalized to 8",
                "points": 16,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "topics": [
                "cli",
                "developer-tools",
                "devops",
                "dql",
                "dynatrace",
                "monitoring",
                "observability"
              ],
              "has_wiki": false,
              "homepage": "https://dynatrace-oss.github.io/dtctl/",
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://dynatrace-oss.github.io/dtctl/",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "7 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 7
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 69,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "moderate",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Branch-Protection. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 61,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 6.1
            },
            "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": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "26 out of 29 merged PRs checked by a CI test -- score normalized to 8",
                "points": 2,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 8/22 approved changesets -- score normalized to 3",
                "points": 2.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 8 contributing companies or organizations",
                "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": "update tool detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 15 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 detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "5 out of the last 5 releases have a total of 5 signed artifacts.",
                "points": 6,
                "status": "partial",
                "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": "8 existing vulnerabilities detected",
                "points": 1.5,
                "status": "partial",
                "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 151 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": 151
                }
              },
              {
                "code": "advisories_repo_graph_caveat",
                "params": {}
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 8,
              "affected_packages": 4,
              "assessed_packages": 151,
              "unassessed_packages": 0,
              "affected_by_severity": "critical 1, high 2, unknown 1",
              "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": 151,
              "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": 9
            },
            "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": 82,
        "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.987,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 17569
            },
            "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": "78 of 79 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 78,
                      "sampled": 79
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "excellent",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "has_nix": true,
              "has_tests": true,
              "lockfiles": [
                "Gemfile.lock",
                "go.sum"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [
                "makefile"
              ],
              "has_devcontainer": true,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 0.16,
              "toolchain_manifests": [
                "go.mod",
                "sdk/go.mod"
              ],
              "dependency_bot_commit_share": 0.16
            },
            "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": "devcontainer, Nix, lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "devcontainer, Nix, lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "16 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 16,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "16 of the last 100 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 16,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 99,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 112576,
              "source_files_sampled": 580,
              "oversized_source_files": 6
            },
            "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": "6/580 source files over 60KB",
                "points": 54.4,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 580,
                      "oversized": 6
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [],
  "report_type": "repository",
  "generated_at": "2026-07-21T21:05:33.247031Z",
  "schema_version": "0.23.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/d/dynatrace-oss/dtctl.svg",
  "full_name": "dynatrace-oss/dtctl",
  "license_state": "standard",
  "license_spdx": "Apache-2.0"
}

Scores are signals, not warranties. They reflect publicly visible practices on GitHub — not a code audit, and not a security guarantee.

Missing data is excluded and weights renormalized, never scored as zero. Methodology is versioned and open: metrics v1.13.0, schema v0.23.0 — full methodology · metrics wiki.

How one result sits in the wider record: aggregate statisticsGo.