Registro público
Informe de salud del softwareesquema 0.23.0 · métricas 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 estrellas⑂ 58 forksdesde ene 2026Ver en GitHub ↗

dynatrace-oss/dtctl tiene un índice de salud de 77 sobre 100, lo que lo sitúa en la banda Bueno. Su puntuación más alta es Vitality (89/100) y la más baja, Security (69/100). Se actualizó por última vez hoy. Una sola persona concentra la mayor parte del trabajo reciente.

77
global / 100
Bueno

Índice de salud del software

Las métricas se agrupan en categorías ponderadas sobre una escala de 1 a 100. El resultado global parte de su media; cuando la evidencia pública activa la Política de Jurisdicciones de Alto Riesgo, la calificación se ajusta y recibe el límite 49 (En riesgo). Preparación para IA queda fuera.

77
Excelente85-100Ejemplar; cumple prácticamente todos los criterios evaluados
Bueno70-84Saludable; carencias menores
Moderado50-69Aceptable con carencias notables; se recomienda revisión
En riesgo30-49Debilidades significativas; su adopción exige cautela
Crítico1-29Problemas graves (proyecto abandonado, un solo mantenedor, sin higiene)
VitalidadComunidad yAdopciónSostenibilidady GobernanzaCalidad deIngenieríaSeguridadPreparaciónpara IA

Perfil de puntuación

Cada eje es una categoría. La forma importa más que la media: un proyecto sano llena toda la figura, mientras que un perfil de picos y cráteres indica que la fortaleza en una dimensión enmascara el riesgo en otra.

Titularidad

267 seguidores94 repositorios públicosdesde nov 2019Dynatrace LLC

Este repositorio está respaldado por una organización: una custodia compartida y responsable que puede sobrevivir a cualquier mantenedor individual.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicación
Gogithub.com/dynatrace-oss/dtctlv0.35.0-59hace 0 días
Gogithub.com/dynatrace-oss/dtctl/sdkv0.2.0-2hace 66 días

Métricas por categoría

Vitalidad

¿Está vivo el proyecto: se escribe código y se publican versiones?

89Excelente · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
18.7/36Cadencia de commits — 27/52 semanas con commits
18/18Volumen de commits — 619 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 15 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year619
human_commit_share0,79
days_since_last_push0
active_weeks_last_year27
Cómo se puntúa
27/27Publica versiones — 59 versiones publicadas
36/36Recencia de las versiones — última versión hace 0 días
27/27Cadencia de publicación — una versión cada ~3,9 días
8/10OpenSSF Scorecard: Signed-Releases — 5 out of the last 5 releases have a total of 5 signed artifacts.
Datos de entrada utilizados
releases_count59
latest_release_tagv0.35.0
releases_from_tagsno
days_since_latest_release0
mean_days_between_releases3,9

Comunidad y Adopción

¿Tiene el proyecto usuarios, descargas, atención y unas condiciones acogedoras para quienes contribuyen?

72Bueno · 18% del índice global
Cómo se puntúa
36.1/60Estrellas — 168 estrellas
14.6/25Forks — 58 forks
3.9/15Observadores — 6 observadores
Datos de entrada utilizados
forks58
stars168
watchers6
growth_stateorganic
growth_factor_pct100
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (Apache-2.0)
18/18Guía CONTRIBUTING
13.5/13.5Código de conducta
0/7.2Plantilla de issues
6.3/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributing
has_issue_templateno
has_code_of_conduct
has_pull_request_template

Sostenibilidad y Gobernanza

¿Sobrevivirá el proyecto a sus personas: factor bus, capacidad de respuesta, quién lo respalda y mantenimiento del paquete?

69Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
7.7/22.5Distribución de commits — el principal contribuyente firma el 66% de los commits
13.5/13.5Amplitud de contribuyentes — 40 contribuyentes
10/10OpenSSF Scorecard: Contributors — project has 8 contributing companies or organizations
Datos de entrada utilizados
bus_factor1
contributors_sampled40
top_contributor_share0,658
Cómo se puntúa
38/46.8Resolución de issues — 81% de issues cerradas
34/38.3Aceptación de PR — 250/281 PR decididos fusionados
4.5/15OpenSSF Scorecard: Code-Review — Found 8/22 approved changesets -- score normalized to 3
Datos de entrada utilizados
merged_prs250
open_issues15
closed_issues65
issue_closed_ratio0,812
closed_unmerged_prs31
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
17.5/25Alcance del propietario — 267 seguidores de dynatrace-oss
25/25Trayectoria — 94 repos públicos, cuenta de ~6 años
Datos de entrada utilizados
followers267
owner_typeOrganization
is_verified
owner_logindynatrace-oss
public_repos94
account_age_days2430
Cómo se puntúa
25/25Publicado y resoluble — 2 paquete(s) en go
35/35Recencia de publicación — última publicación hace 0 días
20/20Historial de versiones — 59 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesgithub.com/dynatrace-oss/dtctl, github.com/dynatrace-oss/dtctl/sdk
ecosystemsgo
any_deprecatedno
min_days_since_publish0

Calidad de Ingeniería

¿Existen unas prácticas mínimas de ingeniería y documentación?

84Bueno · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 9 flujo(s) de trabajo
24/24Pruebas presentes
16/16Configuración de linter — .golangci.yml
0/9.6Hooks de pre-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
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_config
has_precommit_configno

Documentación

90Excelente
Cómo se puntúa
30/30README
25/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — https://dynatrace-oss.github.io/dtctl/
10/10Descripción del repositorio
10/10Topics — 7 topics
0/10Wiki
Datos de entrada utilizados
topicscli, developer-tools, devops, dql, dynatrace, monitoring, observability
has_wikino
homepagehttps://dynatrace-oss.github.io/dtctl/
has_readme
has_docs_dir
has_description

Seguridad

¿Son sólidas las prácticas visibles de seguridad y de cadena de suministro, sin exposición jurisdiccional de alto riesgo sin resolver?

69Moderado · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — sin datos
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.5Licencia — 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
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate6,1
Excluidos de la puntuación (sin datos o no aplicable): branch_protection. Los pesos restantes se han renormalizado.
Cómo se puntúa
35/35Dependencias directas libres de avisos conocidos — ninguna dependencia directa tiene un aviso conocido
0/25Dependencias indirectas libres de avisos conocidos — el conjunto transitivo no es separable de las dependencias de desarrollo y prueba en este alcance
0/40Sin avisos pendientes — ningún aviso tiene fecha de publicación
Datos de entrada utilizados
sourceosv
advisories8
affected_packages4
assessed_packages151
unassessed_packages0
affected_by_severitycritical 1, high 2, unknown 1
direct_affected_packages0
Excluidos de la puntuación (sin datos o no aplicable): Dependencias indirectas libres de avisos conocidos, Sin avisos pendientes. Los pesos restantes se han renormalizado. Se cotejaron 151 dependencias resueltas con OSV. Este repositorio no publica ningún paquete que el índice resuelva, por lo que se evaluó en su lugar el grafo de dependencias del repositorio. Ese grafo mezcla fijaciones de desarrollo y prueba con las dependencias distribuidas, de modo que solo se puntúan las dependencias declaradas en tiempo de ejecución; los hallazgos transitivos se informan como contexto y quedan excluidos de la puntuación. No se analiza la alcanzabilidad.

Preparación para IA

¿Hasta qué punto está el repositorio preparado para desarrollarse y mantenerse con agentes de codificación de IA? Es una insignia independiente y experimental — peso 0,0, de modo que se presenta por separado y no afecta a la puntuación de salud global.

82Bueno · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — AGENTS.md, CLAUDE.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 78 de 79 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,987
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes17.569
Cómo se puntúa
18/18Arranque con un solo comando — makefile
22/22Pruebas automatizadas
11/11Configuración de lint / formato — .golangci.yml
11/11Verificación estática de tipos — Go (tipado estático)
10/10Entorno reproducible — devcontainer, Nix, lockfile
10/10Práctica demostrada con agentes — 16 de los últimos 100 commits con autoría o crédito de agente
8/8Mantenimiento automatizado — 16 de los últimos 100 commits son actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nix
has_tests
lockfilesGemfile.lock, go.sum
has_dockerfileno
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
Cómo se puntúa
45/45Código verificable por tipos — Go (tipado estático)
54.4/55Tamaños de archivo manejables — 6/580 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageGo
largest_source_bytes112.576
source_files_sampled580
oversized_source_files6
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
0/20Servidor MCP
40/40Ejemplos ejecutables — examples
Datos de entrada utilizados
example_dirsexamples
has_mcp_signalno
api_schema_files

Datos clave

168estrellas de GitHub
40contribuidores
619commits en los últimos 12 meses
0días desde el último push
59versiones publicadas
1factor bus
15issues abiertas
Goecosistemas de paquetes

Más detalle

Historial de estrellas y forks 168 ★ / 58 ⇿
168Estrellas
58Forks
58Versiones

Cuándo se añadió cada estrella y fork, recopilado de GitHub y agrupado por día. El crecimiento acumulado se sitúa justo encima de las adiciones diarias que lo componen, de modo que ambos se leen en conjunto: la acumulación orgánica sostenida no se parece en nada a un pico abrupto y efímero. Cuando esa diferencia es medible, se informa como autenticidad del crecimiento.

0408012016020016858192026-012026-042026-07
Mayor 0Menor 32Parche 23
OpenSSF Scorecard 6.1 / 10
6.1agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).Scorecard v5.5.0 · 2026-07-21 21:05 UTC

10Binary-Artifactsno binaries found in the repo
n/dBranch-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
Dependencias directas 30
RegistroPaqueteRestricción de versiónManifiesto
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
Todas las dependencias 151

Conjunto completo de dependencias resueltas según el grafo de dependencias de GitHub: 24 paquetes directos y 127 indirectos (transitivos). El cierre transitivo es completo cuando el repositorio incluye un lockfile.

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

Este repositorio no publica ningún paquete que el índice resuelva, así que se evaluó su propio grafo de dependencias — 151 paquetes, que incluyen también fijaciones de desarrollo y prueba que nunca se distribuyen: 4 tienen avisos conocidos, de los cuales 0 son directas.

PaqueteVersiónRelaciónGravedadAvisosCorregido en
kramdown1.14.0indirectacrítica12.3.0
activesupport4.2.9indirectaalta58.1.2.1
jekyll3.6.2indirectaalta13.8.4
golang.org/x/netv0.55.0indirectadesconocida10.56.0

Un aviso significa que la versión registrada en el grafo de dependencias cae dentro del rango afectado de un aviso. No se analiza la alcanzabilidad, y el grafo incluye fijaciones de desarrollo y prueba: un hallazgo puede referirse al utillaje y no al software distribuido.

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

Las puntuaciones son señales, no garantías. Reflejan prácticas públicamente visibles en GitHub; no son una auditoría de código ni una garantía de seguridad.

Los datos ausentes se excluyen y los pesos se renormalizan; nunca se puntúan como cero. La metodología es versionada y abierta: métricas v1.13.0, esquema v0.23.0 — metodología completa · wiki de métricas.

Cómo se sitúa un resultado dentro del registro general: estadísticas agregadasGo.