公开记录
软件健康报告模式 0.23.0 · 指标 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 星标⑂ 58 复刻始于 2026年1月在 GitHub 上查看 ↗

dynatrace-oss/dtctl 的健康指数为 100 分中的 77 分,处于「良好」区间。 其得分最高的类别是Vitality(89/100),最低的是Security(69/100)。 最近一次更新在今天。 近期的大部分工作由 1 位贡献者完成。

77
总分 / 100
良好

软件健康指数

指标归入加权类别,统一采用 1–100 量表。总体分先取类别加权平均;当公开证据触发高风险司法辖区政策时,评级会按政策调整,并设置 49(有风险)的上限。AI 就绪度不计入总体分。

77
优秀85-100堪称典范;基本满足所有检验标准
良好70-84健康;仅有轻微不足
中等50-69可接受,但存在明显不足;建议进行审查
存在风险30-49存在重大薄弱环节;采用时应保持审慎
危急1-29问题严重(项目被弃置、仅有单一维护者、缺乏基本工程规范)
活力社区与采用可持续性与治理工程质量安全AI 就绪度

评分画像

每条轴代表一个类别。形状比平均值更重要——健康的对象会填满整个图形,而“一峰一谷”式画像意味着某一维度的优势正掩盖另一维度的风险。

所有权

267 关注者94 个公开仓库始于 2019年11月Dynatrace LLC

该仓库由组织支持——共同承担、可问责的托管责任,可延续于任何单一维护者之后。

软件包生态系统

注册表软件包版本月下载量版本数最近发布
Gogithub.com/dynatrace-oss/dtctlv0.35.0-590 天前
Gogithub.com/dynatrace-oss/dtctl/sdkv0.2.0-266 天前

按类别列示的指标

活力

项目是否仍有生命——是否仍在编写代码,是否仍在发布版本?

89优秀 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 0 天前
18.7/36提交节奏 — 52 周中有 27 周有提交
18/18提交量 — 最近一年 619 次提交
10/10OpenSSF Scorecard:Maintained — 30 commit(s) and 15 issue activity found in the last 90 days -- score normalized to 10
所用输入
commits_last_year619
human_commit_share0.79
days_since_last_push0
active_weeks_last_year27

发布纪律

98优秀
评分方式
27/27有发布版本 — 已发布 59 个发布版本
36/36发布时效 — 最近一次发布版本于 0 天前
27/27发布节奏 — 约每 3.9 天发布一次
8/10OpenSSF Scorecard:Signed-Releases — 5 out of the last 5 releases have a total of 5 signed artifacts.
所用输入
releases_count59
latest_release_tagv0.35.0
releases_from_tags
days_since_latest_release0
mean_days_between_releases3.9

社区与采用

项目是否拥有用户、下载量与关注度,并具备欢迎贡献者参与的配置?

72良好 · 占总体的 18%
评分方式
36.1/60星标 — 168 个星标
14.6/25复刻 — 58 个复刻
3.9/15关注者 — 6 位关注者
所用输入
forks58
stars168
watchers6
growth_stateorganic
growth_factor_pct100

社区健康

92优秀
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(Apache-2.0)
18/18CONTRIBUTING 指南
13.5/13.5行为准则
0/7.2议题模板
6.3/6.3PR 模板
所用输入
has_readme
has_license
has_contributing
has_issue_template
has_code_of_conduct
has_pull_request_template

可持续性与治理

项目能否在其成员之外延续——巴士系数、响应能力、由谁支持,以及软件包的维护状况?

69中等 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
7.7/22.5提交分布 — 头号贡献者编写了 66% 的提交
13.5/13.5贡献者广度 — 40 位贡献者
10/10OpenSSF Scorecard:Contributors — project has 8 contributing companies or organizations
所用输入
bus_factor1
contributors_sampled40
top_contributor_share0.658
评分方式
38/46.8议题解决 — 81% 的议题已关闭
34/38.3PR 接受 — 已裁定的 PR 中 250/281 已合并
4.5/15OpenSSF Scorecard:Code-Review — Found 8/22 approved changesets -- score normalized to 3
所用输入
merged_prs250
open_issues15
closed_issues65
issue_closed_ratio0.812
closed_unmerged_prs31
评分方式
30/30所有权背书 — 组织持有
0/20已验证域名
17.5/25所有者影响力 — dynatrace-oss 有 267 位关注者
25/25既往记录 — 94 个公开仓库,账户约 6 年
所用输入
followers267
owner_typeOrganization
is_verified
owner_logindynatrace-oss
public_repos94
account_age_days2,430
评分方式
25/25已发布且可解析 — go 上有 2 个软件包
35/35发布时效 — 最近一次发布于 0 天前
20/20版本历史 — 59 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesgithub.com/dynatrace-oss/dtctl, github.com/dynatrace-oss/dtctl/sdk
ecosystemsgo
any_deprecated
min_days_since_publish0

工程质量

基础的工程与文档实践是否到位?

84良好 · 占总体的 20%

工程实践

80良好
评分方式
24/24CI 工作流 — 9 个工作流
24/24存在测试
16/16Linter 配置 — .golangci.yml
0/9.6Pre-commit 钩子
0/6.4.editorconfig
16/20OpenSSF Scorecard:CI-Tests — 26 out of 29 merged PRs checked by a CI test -- score normalized to 8
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config

文档

90优秀
评分方式
30/30README
25/25文档目录
15/15文档 / 主页站点 — https://dynatrace-oss.github.io/dtctl/
10/10仓库描述
10/10主题标签 — 7 个主题标签
0/10Wiki
所用输入
topicscli, developer-tools, devops, dql, dynatrace, monitoring, observability
has_wiki
homepagehttps://dynatrace-oss.github.io/dtctl/
has_readme
has_docs_dir
has_description

安全

可见的安全与供应链实践是否稳固,且不存在未解决的高风险司法辖区暴露?

69中等 · 占总体的 16%

安全态势

61中等
评分方式
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — 无数据
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.5许可证 — 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
所用输入
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate6.1
已排除计分(无数据或不适用):branch_protection。 其余权重已重新归一化。
评分方式
35/35直接依赖不含已知公告 — 没有直接依赖携带已知公告
0/25间接依赖不含已知公告 — 在此范围内,传递依赖集合无法与开发和测试依赖区分
0/40没有长期未处理的公告 — 没有公告带有发布日期
所用输入
sourceosv
advisories8
affected_packages4
assessed_packages151
unassessed_packages0
affected_by_severitycritical 1, high 2, unknown 1
direct_affected_packages0
已排除计分(无数据或不适用):间接依赖不含已知公告, 没有长期未处理的公告。 其余权重已重新归一化。 已将 151 个已解析依赖与 OSV 比对。 该仓库未发布任何索引可解析的软件包,因此改为评估仓库依赖图。该图将开发与测试版本固定同交付的依赖混在一起,因此仅对声明的运行时依赖计分;传递性发现仅作为背景信息列出,不计入评分。 未对可达性进行分析。

AI 就绪度

该仓库在多大程度上具备与 AI 编码代理协同开发与维护的条件?这是一枚独立的实验性徽章——权重为 0.0,因此单独呈现,不影响总体健康评分。

82良好 · 占总体的 0%
评分方式
45/45代理指令 — AGENTS.md, CLAUDE.md
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 79 次人类提交中有 78 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.987
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes17,569
评分方式
18/18一条命令的引导启动 — makefile
22/22自动化测试
11/11Lint / 格式化配置 — .golangci.yml
11/11静态类型检查 — Go(静态类型)
10/10可复现环境 — devcontainer, Nix, lockfile
10/10已体现的代理实践 — 最近 100 次提交中有 16 次由代理编写或署名代理
8/8自动化维护 — 最近 100 次提交中有 16 次为自动依赖更新
0/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
所用输入
has_nix
has_tests
lockfilesGemfile.lock, go.sum
has_dockerfile
typed_language
bootstrap_filesmakefile
has_devcontainer
has_linter_config
typecheck_configs
agent_commit_share0.16
toolchain_manifestsgo.mod, sdk/go.mod
dependency_bot_commit_share0.16
评分方式
45/45可类型检查的代码 — Go(静态类型)
54.4/55可控的文件大小 — 采样的 580 个源文件中有 6 个超过 60KB
所用输入
primary_languageGo
largest_source_bytes112,576
source_files_sampled580
oversized_source_files6

机器可读接口

40存在风险
评分方式
0/40API 模式(OpenAPI/GraphQL/proto)
0/20MCP 服务器
40/40可运行示例 — examples
所用输入
example_dirsexamples
has_mcp_signal
api_schema_files

关键数据

168GitHub 星标
40贡献者
619最近 12 个月提交数
0距最近推送天数
59发布版本数
1巴士系数(bus factor)
15开放议题
Go软件包生态系统数

更多细节

Star 与 Fork 历史 168 ★ / 58 ⇿
168Star
58Fork
58发布

每颗 star 和每个 fork 的添加时间,来自 GitHub 并按天汇总。累计增长位于其构成来源——每日新增——的正上方,二者可相互对照:稳定的自然增长与短暂的突增形态截然不同。当这一差别可被衡量时,它会作为增长真实性予以报告。

0408012016020016858192026-012026-042026-07
主版本 0次版本 32修订 23
OpenSSF Scorecard 6.1 / 10
6.1综合

来自开源项目 OpenSSF Scorecard 的独立、工具无关的安全评估。每项检查奖励的是安全实践本身,而非特定供应商的工具。Scorecard 无法判定的检查项标记为 不适用,并从安全评分中剔除(绝不按零分计)。Scorecard v5.5.0 · 2026-07-21 21:05 UTC

10Binary-Artifactsno binaries found in the repo
不适用Branch-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
直接依赖 30
注册表软件包版本约束清单文件
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
全部依赖 151

来自 GitHub 依赖图的完整解析依赖集合:24 个直接依赖与 127 个间接(传递)软件包。仓库提交锁文件时,传递闭包才是完整的。

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

该仓库未发布可被索引解析的包,因此评估的是其自身的依赖图——共 151 个包,其中也包含从不交付的开发与测试版本固定:4 个存在已知公告,0 个为直接依赖。

软件包版本关系严重程度公告数修复版本
kramdown1.14.0间接严重12.3.0
activesupport4.2.9间接58.1.2.1
jekyll3.6.2间接13.8.4
golang.org/x/netv0.55.0间接未知10.56.0

公告表示依赖图中记录的版本落入某条公告的受影响范围。可达性未经分析,且依赖图包含开发与测试的版本固定——某项发现可能只涉及工具链而非交付的软件。

原始 JSON 报告 机器可读
{
  "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"
}

评分是信号,而非担保。 评分反映的是 GitHub 上公开可见的实践——不是代码审计,也不是安全保证。

缺失数据将被剔除并重新归一化权重,绝不按零分计。方法论已版本化并公开:指标 v1.13.0、模式 v0.23.0—— 完整方法论 · 指标知识库.

单项结果在整体记录中的位置: 汇总统计Go.