Публічний реєстр
Звіт про здоров'я програмного забезпеченнясхема 0.23.0 · метрики 1.13.0 · 2026-07-21 21:05 UTC

dynatrace-oss / dtctl

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

GoApache-2.0★ 168 зірок⑂ 58 форківз січ. 2026 р.Переглянути на GitHub ↗

dynatrace-oss/dtctl має індекс здоров’я 77 зі 100, що відповідає смузі «Добрий». Найвищий показник — Vitality (89/100), найнижчий — Security (69/100). Останнє оновлення — сьогодні. Більшість нещодавньої роботи виконує один учасник.

77
загалом / 100
Добрий

Індекс здоров'я програмного забезпечення

Метрики згруповано у зважені категорії на шкалі 1–100. Загальна оцінка починається як їхнє середнє; коли публічні дані активують Політику юрисдикцій високого ризику, рейтинг коригується й отримує верхню межу 49 («Під ризиком»). Готовність до ШІ не входить до індексу.

77
Відмінний85-100Зразковий; відповідає практично всім перевіреним критеріям
Добрий70-84Здоровий; незначні прогалини
Помірний50-69Прийнятний, але з помітними прогалинами; рекомендовано перевірку
У зоні ризику30-49Суттєві слабкі місця; впровадження потребує обережності
Критичний1-29Серйозні проблеми (покинутий, єдиний мейнтейнер, без базової гігієни)
ЖиттєздатністьСпільнота тавпровадженняСталість таврядуванняІнженернаякістьБезпекаГотовність доШІ

Профіль оцінок

Кожна вісь — окрема категорія. Форма важить більше, ніж середнє: здоровий об'єкт заповнює всю фігуру, тоді як профіль із піками та провалами означає, що сила в одному вимірі маскує ризик в іншому.

Власність

Dynatrace Open SourceОрганізація
267 підписників94 публічні репозиторіїз лист. 2019 р.Dynatrace LLC

За цим репозиторієм стоїть організація — спільна, підзвітна опіка, здатна пережити будь-якого окремого мейнтейнера.

Пакетні екосистеми

РеєстрПакетВерсіяЗавантажень / місВерсіїОстання публікація
Gogithub.com/dynatrace-oss/dtctlv0.35.0-590 днів тому
Gogithub.com/dynatrace-oss/dtctl/sdkv0.2.0-266 днів тому

Метрики за категоріями

Життєздатність

Чи живий проєкт — чи пишеться код і чи виходять релізи?

89Відмінний · 22% загального індексу
Як обчислюється оцінка
36/36Свіжість push — останній push 0 дн. тому
18.7/36Ритм комітів — 27/52 тижнів із комітами
18/18Обсяг комітів — 619 комітів за останній рік
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 15 issue activity found in the last 90 days -- score normalized to 10
Використані вхідні дані
commits_last_year619
human_commit_share0,79
days_since_last_push0
active_weeks_last_year27
Як обчислюється оцінка
27/27Випускає релізи — опубліковано 59 релізів
36/36Свіжість релізів — останній реліз 0 дн. тому
27/27Ритм релізів — реліз кожні ~3,9 дн.
8/10OpenSSF Scorecard: Signed-Releases — 5 out of the last 5 releases have a total of 5 signed artifacts.
Використані вхідні дані
releases_count59
latest_release_tagv0.35.0
releases_from_tagsні
days_since_latest_release0
mean_days_between_releases3,9

Спільнота та впровадження

Чи має проєкт користувачів, завантаження, увагу та влаштовані умови для контриб’юторів?

72Добрий · 18% загального індексу
Як обчислюється оцінка
36.1/60Зірки — 168 зірок
14.6/25Форки — 58 форків
3.9/15Спостерігачі — 6 спостерігачів
Використані вхідні дані
forks58
stars168
watchers6
growth_stateorganic
growth_factor_pct100
Як обчислюється оцінка
22.5/22.5README
22.5/22.5Ліцензія — визнана ліцензія (Apache-2.0)
18/18Настанови CONTRIBUTING
13.5/13.5Кодекс поведінки
0/7.2Шаблон issue
6.3/6.3Шаблон PR
Використані вхідні дані
has_readmeтак
has_licenseтак
has_contributingтак
has_issue_templateні
has_code_of_conductтак
has_pull_request_templateтак

Сталість та врядування

Чи переживе проєкт своїх людей — бас-фактор, реактивність, хто за ним стоїть і як супроводжуються пакети?

69Помірний · 24% загального індексу
Як обчислюється оцінка
9/54Бас-фактор — на 1 контриб’ютор(ів) припадає половина всіх комітів
7.7/22.5Розподіл комітів — головний контриб’ютор — автор 66% комітів
13.5/13.5Широта контриб’юторів — 40 контриб’юторів
10/10OpenSSF Scorecard: Contributors — project has 8 contributing companies or organizations
Використані вхідні дані
bus_factor1
contributors_sampled40
top_contributor_share0,658
Як обчислюється оцінка
38/46.8Вирішення issue — закрито 81% issue
34/38.3Прийняття PR — злито 250/281 вирішених PR
4.5/15OpenSSF Scorecard: Code-Review — Found 8/22 approved changesets -- score normalized to 3
Використані вхідні дані
merged_prs250
open_issues15
closed_issues65
issue_closed_ratio0,812
closed_unmerged_prs31
Як обчислюється оцінка
30/30Підтримка власника — у власності організації
0/20Верифікований домен
17.5/25Охоплення власника — 267 підписників у dynatrace-oss
25/25Послужний список — 94 публічних репозиторіїв, вік облікового запису ~6 р.
Використані вхідні дані
followers267
owner_typeOrganization
is_verified
owner_logindynatrace-oss
public_repos94
account_age_days2 430

Супровід пакетів

100Відмінний
Як обчислюється оцінка
25/25Опубліковано й доступно — 2 пакет(ів) у go
35/35Свіжість публікацій — остання публікація 0 дн. тому
20/20Історія версій — 59 опублікованих версій
20/20Не застарілий — активний, не deprecated і не yanked
Використані вхідні дані
packagesgithub.com/dynatrace-oss/dtctl, github.com/dynatrace-oss/dtctl/sdk
ecosystemsgo
any_deprecatedні
min_days_since_publish0

Інженерна якість

Чи наявні базові інженерні практики та документація?

84Добрий · 20% загального індексу
Як обчислюється оцінка
24/24Процеси CI — 9 процес(ів) CI
24/24Наявні тести
16/16Конфігурація лінтера — .golangci.yml
0/9.6Pre-commit-хуки
0/6.4.editorconfig
16/20OpenSSF Scorecard: CI-Tests — 26 out of 29 merged PRs checked by a CI test -- score normalized to 8
Використані вхідні дані
has_ciтак
has_testsтак
has_editorconfigні
has_linter_configтак
has_precommit_configні

Документація

90Відмінний
Як обчислюється оцінка
30/30README
25/25Каталог документації
15/15Сайт документації / домашня сторінка — https://dynatrace-oss.github.io/dtctl/
10/10Опис репозиторію
10/10Теми — 7 тем
0/10Wiki
Використані вхідні дані
topicscli, developer-tools, devops, dql, dynatrace, monitoring, observability
has_wikiні
homepagehttps://dynatrace-oss.github.io/dtctl/
has_readmeтак
has_docs_dirтак
has_descriptionтак

Безпека

Чи міцні видимі практики безпеки й ланцюга постачання, без непослабленої пов’язаності з юрисдикціями високого ризику?

69Помірний · 16% загального індексу

Стан безпеки

61Помірний
Як обчислюється оцінка
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — немає даних
2/2.5CI-Tests — 26 out of 29 merged PRs checked by a CI test -- score normalized to 8
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
2.2/7.5Code-Review — Found 8/22 approved changesets -- score normalized to 3
2.5/2.5Contributors — project has 8 contributing companies or organizations
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Ліцензія — license file detected
7.5/7.5Maintained — 30 commit(s) and 15 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
5/5Security-Policy — security policy file detected
6/7.5Signed-Releases — 5 out of the last 5 releases have a total of 5 signed artifacts.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
1.5/7.5Vulnerabilities — 8 existing vulnerabilities detected
Використані вхідні дані
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate6,1
Виключено з оцінювання (немає даних або не застосовно): branch_protection. Залишкові ваги перенормовано.
Як обчислюється оцінка
35/35Прямі залежності без відомих сповіщень — жодна пряма залежність не має відомих сповіщень
0/25Непрямі залежності без відомих сповіщень — транзитивний набір не відокремлюється від залежностей розробки й тестування в цьому обсязі
0/40Немає задавнених сповіщень — жодне сповіщення не має дати публікації
Використані вхідні дані
sourceosv
advisories8
affected_packages4
assessed_packages151
unassessed_packages0
affected_by_severitycritical 1, high 2, unknown 1
direct_affected_packages0
Виключено з оцінювання (немає даних або не застосовно): Непрямі залежності без відомих сповіщень, Немає задавнених сповіщень. Залишкові ваги перенормовано. Звірено 151 резолвлених залежностей із OSV. Цей репозиторій не публікує пакета, який резолвить індекс, тож натомість оцінено граф залежностей репозиторію. Цей граф змішує закріплені версії для розробки й тестування зі справді постачаними залежностями, тож оцінюються лише задекларовані runtime-залежності; транзитивні знахідки подаються як контекст і в оцінку не входять. Досяжність не аналізується.

Готовність до ШІ

Наскільки репозиторій оснащений для розробки та супроводу за участі ШІ-агентів? Незалежний, експериментальний бейдж — вага 0.0, тож він подається окремо і не впливає на загальний індекс здоров'я.

82Добрий · 0% загального індексу
Як обчислюється оцінка
45/45Інструкції для агентів — AGENTS.md, CLAUDE.md
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 78 з 79 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share0,987
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes17 569
Як обчислюється оцінка
18/18Розгортання однією командою — makefile
22/22Автоматизовані тести
11/11Конфігурація лінтера / форматера — .golangci.yml
11/11Статична перевірка типів — Go (статично типізована)
10/10Відтворюване середовище — devcontainer, Nix, lockfile
10/10Підтверджена практика роботи з агентами — 16 з останніх 100 комітів створено агентом або з його зазначенням
8/8Автоматизоване супроводження — 16 з останніх 100 комітів — автоматичні оновлення залежностей
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Використані вхідні дані
has_nixтак
has_testsтак
lockfilesGemfile.lock, go.sum
has_dockerfileні
typed_languageтак
bootstrap_filesmakefile
has_devcontainerтак
has_linter_configтак
typecheck_configs
agent_commit_share0,16
toolchain_manifestsgo.mod, sdk/go.mod
dependency_bot_commit_share0,16
Як обчислюється оцінка
45/45Типізований код — Go (статично типізована)
54.4/55Керовані розміри файлів — 6/580 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languageGo
largest_source_bytes112 576
source_files_sampled580
oversized_source_files6
Як обчислюється оцінка
0/40Схема API (OpenAPI/GraphQL/proto)
0/20Сервер MCP
40/40Придатні до запуску приклади — examples
Використані вхідні дані
example_dirsexamples
has_mcp_signalні
api_schema_files

Ключові факти

168зірок GitHub
40контриб'юторів
619комітів за останні 12 місяців
0днів від останнього пушу
59релізів
1бас-фактор
15відкритих issue
Goпакетних екосистем

Докладніше

Історія зірок і форків 168 ★ / 58 ⇿
168Зірки
58Форки
58Релізи

Коли додано кожну зірку й форк — зібрано з GitHub і згруповано за днями. Кумулятивне зростання розміщено просто над денними додаваннями, з яких воно складається, тож їх видно одне проти одного: рівномірне органічне накопичення виглядає зовсім інакше, ніж різкий короткочасний сплеск. Там, де цю різницю можна виміряти, її подано як автентичність росту.

0408012016020016858192026-012026-042026-07
Мажорні 0Мінорні 32Патчі 23
OpenSSF Scorecard 6.1 / 10
6.1сукупно

Незалежна, не прив'язана до інструментів оцінка безпеки від відкритого проєкту OpenSSF Scorecard. Кожна перевірка винагороджує практику безпеки, а не інструмент конкретного постачальника. Перевірки, які Scorecard не зміг визначити, позначено н/д і виключено з оцінки безпеки (вони ніколи не зараховуються як нуль).Scorecard v5.5.0 · 2026-07-21 21:05 UTC

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

Повний розв'язаний набір залежностей із графа залежностей GitHub: 24 прямих і 127 непрямих (транзитивних) пакетів. Транзитивне замикання є повним, коли в репозиторії закомічено lockfile.

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

Цей репозиторій не публікує пакета, який розпізнає індекс, тож оцінено його власний граф залежностей — 151 пакетів, серед яких є й піниї розробки та тестування, що ніколи не постачаються: 4 мають відомі сповіщення, з них 0 прямі.

ПакетВерсіяЗв'язокКритичністьСповіщеньВиправлено в
kramdown1.14.0непрямакритична12.3.0
activesupport4.2.9непрямависока58.1.2.1
jekyll3.6.2непрямависока13.8.4
golang.org/x/netv0.55.0непряманевідома10.56.0

Сповіщення означає, що версія, записана в графі залежностей, потрапляє в уражений діапазон. Досяжність не аналізується, а граф містить піниї розробки й тестування — знахідка може стосуватися інструментів, а не поставленого коду.

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

Оцінки — це сигнали, а не гарантії. Вони відображають публічно видимі практики на GitHub — це не аудит коду й не гарантія безпеки.

Відсутні дані виключаються, а ваги перенормовуються — нуль за відсутність ніколи не ставиться. Методологія версіонована й відкрита: метрики v1.13.0, схема v0.23.0 — повна методологія · вікі метрик.

Як окремий результат виглядає на тлі всього реєстру: сукупна статистикаGo.