公开记录
软件健康报告模式 0.27.0 · 指标 1.13.0 · 2026-07-25 12:51 UTC

PingCAP-QE / ee-apps

Application open source codes of EE

Python · GoMIT★ 1 星标⑂ 3 复刻始于 2023年3月在 GitHub 上查看 ↗

PingCAP-QE/ee-apps 的健康指数为 100 分中的 66 分,处于「中等」区间。 其得分最高的类别是Vitality(94/100),最低的是Community & Adoption(27/100)。 最近一次更新在今天。 近期的大部分工作由 1 位贡献者完成。

66
总分 / 100
中等

软件健康指数

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

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

评分画像

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

所有权

22 关注者44 个公开仓库始于 2020年10月

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

软件包生态系统

注册表软件包版本月下载量版本数最近发布标签
Gogithub.com/PingCAP-QE/ee-appsv2026.7.19+incompatible-489 天前
PyPIroster指向其他仓库——不计分0.1.1112,60351366 天前youtuberosterrecordregister

按类别列示的指标

活力

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

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

发布纪律

100优秀
评分方式
27/27有发布版本 — 已发布 51 个发布版本
36/36发布时效 — 最近一次发布版本于 6 天前
27/27发布节奏 — 约每 7 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — 无数据
所用输入
releases_count51
latest_release_tagv2026.7.19
releases_from_tags
days_since_latest_release6
mean_days_between_releases7
已排除计分(无数据或不适用):OpenSSF Scorecard:Signed-Releases。 其余权重已重新归一化。

社区与采用

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

27危急 · 占总体的 18%
评分方式
0/60星标 — 1 个星标
2.5/25复刻 — 3 个复刻
3.3/15关注者 — 5 位关注者
所用输入
forks3
stars1
watchers5
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

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

可持续性与治理

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

67中等 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
7.4/22.5提交分布 — 头号贡献者编写了 67% 的提交
8.1/13.5贡献者广度 — 6 位贡献者
10/10OpenSSF Scorecard:Contributors — project has 3 contributing companies or organizations -- score normalized to 10
所用输入
bus_factor1
contributors_sampled6
top_contributor_share0.673
评分方式
33/46.8议题解决 — 71% 的议题已关闭
34.9/38.3PR 接受 — 已裁定的 PR 中 494/541 已合并
15/15OpenSSF Scorecard:Code-Review — all changesets reviewed
所用输入
merged_prs494
open_issues5
closed_issues12
issue_closed_ratio0.706
closed_unmerged_prs47
评分方式
30/30所有权背书 — 组织持有
0/20已验证域名
9.8/25所有者影响力 — PingCAP-QE 有 22 位关注者
23.6/25既往记录 — 44 个公开仓库,账户约 5 年
所用输入
followers22
owner_typeOrganization
is_verified
owner_loginPingCAP-QE
public_repos44
account_age_days2,109
评分方式
25/25已发布且可解析 — go 上有 1 个软件包
35/35发布时效 — 最近一次发布于 9 天前
20/20版本历史 — 48 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesgithub.com/PingCAP-QE/ee-apps
ecosystemsgo
any_deprecated
min_days_since_publish9

工程质量

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

75良好 · 占总体的 20%

工程实践

92优秀
评分方式
24/24CI 工作流 — 6 个工作流
24/24存在测试
16/16Linter 配置 — .golangci.yml, eslint.config.mjs
9.6/9.6Pre-commit 钩子
0/6.4.editorconfig
18/20OpenSSF Scorecard:CI-Tests — 29 out of 30 merged PRs checked by a CI test -- score normalized to 9
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config

文档

50中等
评分方式
30/30README
0/25文档目录
0/15文档 / 主页站点
10/10仓库描述
0/10主题标签
10/10Wiki
所用输入
topics
has_wiki
homepage
has_readme
has_docs_dir
has_description

安全

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

61中等 · 占总体的 16%

安全态势

61中等
评分方式
7.5/7.5Binary-Artifacts — no binaries found in the repo
2.2/7.5Branch-Protection — branch protection is not maximal on development and all release branches
2.2/2.5CI-Tests — 29 out of 30 merged PRs checked by a CI test -- score normalized to 9
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
7.5/7.5Code-Review — all changesets reviewed
2.5/2.5Contributors — project has 3 contributing companies or organizations -- score normalized to 10
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 0 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — 无数据
1/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 2
1/5SAST — SAST tool is not run on all commits -- score normalized to 2
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — 无数据
5.2/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 405 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate6.1
已排除计分(无数据或不适用):packaging, signed_releases。 其余权重已重新归一化。

AI 就绪度

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

86优秀 · 占总体的 0%
评分方式
45/45代理指令 — AGENTS.md
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 99 次人类提交中有 98 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.99
agent_instruction_filesAGENTS.md
agent_instruction_max_bytes4,963
评分方式
18/18一条命令的引导启动 — ci-dashboard/Makefile, mac-builder-operator/Makefile, tibuild/Makefile
22/22自动化测试
11/11Lint / 格式化配置 — .golangci.yml, eslint.config.mjs
11/11静态类型检查 — mcp-servers/knowledge-base-mcp/src/vector_search/tidb_vector_ui/tsconfig.json
10/10可复现环境 — Dockerfile, lockfile
10/10已体现的代理实践 — 最近 100 次提交中有 7 次由代理编写或署名代理
8/8自动化维护 — 最近 100 次提交中有 1 次为自动依赖更新
2/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 2
所用输入
has_nix
has_tests
lockfilesgo.sum, package-lock.json, uv.lock
has_dockerfile
typed_language
bootstrap_filesci-dashboard/Makefile, mac-builder-operator/Makefile, tibuild/Makefile
has_devcontainer
has_linter_config
typecheck_configsmcp-servers/knowledge-base-mcp/src/vector_search/tidb_vector_ui/tsconfig.json
agent_commit_share0.07
toolchain_manifestschange-insight/go.mod, chatops-lark/go.mod, cloudevents-server/go.mod, dl/go.mod, experiments/tibuild-v2/go.mod, mac-builder-operator/go.mod, publisher/go.mod, tibuild/go.mod
dependency_bot_commit_share0.01
评分方式
27/45可类型检查的代码 — Python,已配置类型检查(mcp-servers/knowledge-base-mcp/src/vector_search/tidb_vector_ui/tsconfig.json)
53.8/55可控的文件大小 — 采样的 661 个源文件中有 15 个超过 60KB
所用输入
primary_languagePython
largest_source_bytes275,732
source_files_sampled661
oversized_source_files15
评分方式
40/40API 模式(OpenAPI/GraphQL/proto) — dl/gen/http/openapi.json, dl/gen/http/openapi.yaml, experiments/tibuild-v2/internal/service/gen/http/openapi.json, experiments/tibuild-v2/internal/service/gen/http/openapi.yaml, publisher/internal/service/gen/http/openapi.json, publisher/internal/service/gen/http/openapi.yaml, tibuild/docs/swagger.json, tibuild/docs/swagger.yaml
0/20MCP 服务器
40/40可运行示例 — samples
所用输入
example_dirssamples
has_mcp_signal
api_schema_filesdl/gen/http/openapi.json, dl/gen/http/openapi.yaml, experiments/tibuild-v2/internal/service/gen/http/openapi.json, experiments/tibuild-v2/internal/service/gen/http/openapi.yaml, publisher/internal/service/gen/http/openapi.json, publisher/internal/service/gen/http/openapi.yaml, tibuild/docs/swagger.json, tibuild/docs/swagger.yaml

关键数据

1GitHub 星标
6贡献者
242最近 12 个月提交数
0距最近推送天数
51发布版本数
1巴士系数(bus factor)
5开放议题
Go, PyPI软件包生态系统数

数据采集警告

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • pypi package 'roster' points at a different repository (https://github.com/tombulled/roster); excluded from ecosystem scoring
  • Could not fetch pypi package 'ci-dashboard' from its registry
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

更多细节

Star 与 Fork 历史 0 ★ / 3 ⇿
0Star
3Fork
16发布

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

12233312025-092026-012026-04
主版本 0次版本 0修订 16
OpenSSF Scorecard 6.1 / 10
6.1综合

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

10Binary-Artifactsno binaries found in the repo
3Branch-Protectionbranch protection is not maximal on development and all release branches
9CI-Tests29 out of 30 merged PRs checked by a CI test -- score normalized to 9
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
10Code-Reviewall changesets reviewed
10Contributorsproject has 3 contributing companies or organizations -- score normalized to 10
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
不适用Packagingpackaging workflow not detected
2Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 2
2SASTSAST tool is not run on all commits -- score normalized to 2
0Security-Policysecurity policy file not detected
不适用Signed-Releasesno releases found
7Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities405 existing vulnerabilities detected
直接依赖 99
注册表软件包版本约束清单文件
Gogithub.com/gin-gonic/ginv1.10.1change-insight/go.mod
Gogithub.com/spf13/pflagv1.0.6change-insight/go.mod
Gogithub.com/spf13/viperv1.19.0change-insight/go.mod
Gogorm.io/driver/mysqlv1.5.7change-insight/go.mod
Gogorm.io/gormv1.25.12change-insight/go.mod
Gogithub.com/Masterminds/sprig/v3v3.3.0chatops-lark/go.mod
Gogithub.com/allegro/bigcache/v3v3.1.0chatops-lark/go.mod
Gogithub.com/go-resty/resty/v2v2.16.5chatops-lark/go.mod
Gogithub.com/google/go-github/v68v68.0.0chatops-lark/go.mod
Gogithub.com/larksuite/oapi-sdk-go/v3v3.4.7chatops-lark/go.mod
Gogithub.com/mark3labs/mcp-gov0.17.0chatops-lark/go.mod
Gogithub.com/openai/openai-gov0.1.0-beta.11chatops-lark/go.mod
Gogithub.com/rs/zerologv1.33.0chatops-lark/go.mod
Gogopkg.in/yaml.v3v3.0.1chatops-lark/go.mod
PyPIboto3>=1.34.0ci-dashboard/pyproject.toml
PyPIfastapi>=0.115.0ci-dashboard/pyproject.toml
PyPIgoogle-cloud-storage>=2.18.0ci-dashboard/pyproject.toml
PyPIhttpx>=0.27.0ci-dashboard/pyproject.toml
PyPIkafka-python-ng>=2.2.3ci-dashboard/pyproject.toml
PyPIPyMySQL>=1.1.0ci-dashboard/pyproject.toml
PyPISQLAlchemy>=2.0.0ci-dashboard/pyproject.toml
PyPIuvicorn>=0.34.0ci-dashboard/pyproject.toml
Goentgo.io/entv0.14.5cloudevents-server/go.mod
Gogithub.com/Masterminds/sprig/v3v3.3.0cloudevents-server/go.mod
Gogithub.com/cloudevents/sdk-go/v2v2.16.1cloudevents-server/go.mod
Gogithub.com/gin-gonic/ginv1.10.1cloudevents-server/go.mod
Gogithub.com/go-sql-driver/mysqlv1.9.3cloudevents-server/go.mod
Gogithub.com/goccy/go-yamlv1.18.0cloudevents-server/go.mod
Gogithub.com/larksuite/oapi-sdk-go/v3v3.2.8cloudevents-server/go.mod
Gogithub.com/mattn/go-sqlite3v1.14.32cloudevents-server/go.mod
Gogithub.com/pkg/errorsv0.9.1cloudevents-server/go.mod
Gogithub.com/rs/zerologv1.33.0cloudevents-server/go.mod
Gogithub.com/segmentio/kafka-gov0.4.49cloudevents-server/go.mod
Gogithub.com/tektoncd/pipelinev1.3.1cloudevents-server/go.mod
Gok8s.io/apiv0.32.7cloudevents-server/go.mod
Gok8s.io/apimachineryv0.32.7cloudevents-server/go.mod
Goknative.dev/pkgv0.0.0-20250415155312-ed3e2158b883cloudevents-server/go.mod
PyPIgoogle-auth>=2.0.0cost-insight/pyproject.toml
PyPIgoogle-cloud-bigquery>=3.25.0cost-insight/pyproject.toml
PyPIgoogle-cloud-storage>=2.19.0cost-insight/pyproject.toml
PyPIprotobuf>=5.28.0cost-insight/pyproject.toml
PyPIPyMySQL>=1.1.0cost-insight/pyproject.toml
PyPISQLAlchemy>=2.0.0cost-insight/pyproject.toml
Gocloud.google.com/go/storagev1.63.0dl/go.mod
Gogithub.com/ks3sdklib/aws-sdk-gov1.3.0dl/go.mod
Gogithub.com/opencontainers/image-specv1.1.1dl/go.mod
Gogoa.design/cluev1.2.3dl/go.mod
Gogoa.design/goa/v3v3.22.2dl/go.mod
Gogoogle.golang.org/apiv0.286.0dl/go.mod
Gogopkg.in/yaml.v3v3.0.1dl/go.mod
Gooras.land/oras-go/v2v2.5.0dl/go.mod
Gogithub.com/go-logr/logrv1.4.2mac-builder-operator/go.mod
Gogithub.com/onsi/ginkgo/v2v2.22.0mac-builder-operator/go.mod
Gogithub.com/onsi/gomegav1.36.1mac-builder-operator/go.mod
Gok8s.io/apimachineryv0.34.0mac-builder-operator/go.mod
Gok8s.io/client-gov0.34.0mac-builder-operator/go.mod
Gok8s.io/utilsv0.0.0-20250604170112-4c0f3b243397mac-builder-operator/go.mod
Gosigs.k8s.io/controller-runtimev0.22.1mac-builder-operator/go.mod
Gogithub.com/Masterminds/sprig/v3v3.3.0publisher/go.mod
Gogithub.com/PingCAP-QE/ee-apps/dlv0.0.0-20250828141640-8dda9c968d09publisher/go.mod
Gogithub.com/alicebob/miniredis/v2v2.34.0publisher/go.mod
Gogithub.com/cloudevents/sdk-go/v2v2.15.2publisher/go.mod
Gogithub.com/go-redis/redis/v8v8.11.5publisher/go.mod
Gogithub.com/go-redsync/redsync/v4v4.13.0publisher/go.mod
Gogithub.com/go-resty/resty/v2v2.16.5publisher/go.mod
Gogithub.com/google/go-containerregistryv0.20.6publisher/go.mod
Gogithub.com/google/uuidv1.6.0publisher/go.mod
Gogithub.com/rs/zerologv1.33.0publisher/go.mod
Gogithub.com/segmentio/kafka-gov0.4.49publisher/go.mod
Gogoa.design/cluev1.2.3publisher/go.mod
Gogoa.design/goa/v3v3.23.2publisher/go.mod
Gogoa.design/plugins/v3v3.23.0publisher/go.mod
Gogolang.org/x/modv0.30.0publisher/go.mod
Gogopkg.in/yaml.v3v3.0.1publisher/go.mod
Gooras.land/oras-go/v2v2.5.0publisher/go.mod
Gogithub.com/ks3sdklib/aws-sdk-gov1.3.0publisher/go.mod
Gogithub.com/opencontainers/image-specv1.1.1publisher/go.mod
Gogithub.com/stretchr/testifyv1.11.1publisher/go.mod
PyPIPyMySQL>=1.1.0roster/pyproject.toml
PyPISQLAlchemy>=2.0.0roster/pyproject.toml
Gogithub.com/DATA-DOG/go-sqlmockv1.5.2tibuild/go.mod
Gogithub.com/bndr/gojenkinsv1.1.0tibuild/go.mod
Gogithub.com/cloudevents/sdk-go/v2v2.16.1tibuild/go.mod
Gogithub.com/deckarep/golang-set/v2v2.8.0tibuild/go.mod
Gogithub.com/dougsland/jenkinsctlv0.0.1tibuild/go.mod
Gogithub.com/gin-contrib/requestidv1.0.5tibuild/go.mod
Gogithub.com/gin-contrib/staticv1.1.5tibuild/go.mod
Gogithub.com/gin-gonic/ginv1.10.1tibuild/go.mod
Gogithub.com/google/go-github/v61v61.0.0tibuild/go.mod
Gogithub.com/jinzhu/configorv1.2.2tibuild/go.mod
Gogithub.com/rs/zerologv1.33.0tibuild/go.mod
Gogithub.com/stretchr/testifyv1.10.0tibuild/go.mod
Gogithub.com/swaggo/filesv1.0.1tibuild/go.mod
Gogithub.com/swaggo/gin-swaggerv1.6.1tibuild/go.mod
Gogithub.com/swaggo/swagv1.16.4tibuild/go.mod
Gogithub.com/tektoncd/pipelinev1.3.1tibuild/go.mod
Gogopkg.in/yaml.v3v3.0.1tibuild/go.mod
Gogorm.io/driver/mysqlv1.5.7tibuild/go.mod
Gogorm.io/gormv1.25.12tibuild/go.mod
全部依赖 未采集

本报告未能采集到解析后的依赖集合:GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 18564,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Go": 905742,
        "CSS": 50261,
        "HTML": 17677,
        "Shell": 92431,
        "Python": 2677477,
        "Makefile": 14620,
        "Dockerfile": 4949,
        "JavaScript": 289215,
        "TypeScript": 117392,
        "Go Template": 20180
      },
      "pushed_at": "2026-07-25T01:29:24Z",
      "created_at": "2023-03-13T09:36:02Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-24T00:35:24Z",
      "description": "Application open source codes of EE",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Python",
      "significant_languages": [
        "Python",
        "Go"
      ]
    },
    "owner": {
      "blog": null,
      "name": null,
      "type": "Organization",
      "login": "PingCAP-QE",
      "company": null,
      "location": null,
      "followers": 22,
      "avatar_url": "https://avatars.githubusercontent.com/u/72909512?v=4",
      "created_at": "2020-10-15T06:56:01Z",
      "is_verified": null,
      "public_repos": 44,
      "account_age_days": 2109
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v2026.7.19",
          "kind": "patch",
          "published_at": "2026-07-19T00:44:50Z"
        },
        {
          "tag": "v2026.7.12",
          "kind": "patch",
          "published_at": "2026-07-12T00:46:08Z"
        },
        {
          "tag": "v2026.7.5",
          "kind": "patch",
          "published_at": "2026-07-05T00:53:21Z"
        },
        {
          "tag": "v2026.6.28",
          "kind": "patch",
          "published_at": "2026-06-28T04:12:11Z"
        },
        {
          "tag": "v2026.6.21",
          "kind": "patch",
          "published_at": "2026-06-21T04:45:19Z"
        },
        {
          "tag": "v2026.6.14",
          "kind": "patch",
          "published_at": "2026-06-14T04:27:15Z"
        },
        {
          "tag": "v2026.6.7",
          "kind": "patch",
          "published_at": "2026-06-07T04:18:40Z"
        },
        {
          "tag": "v2026.5.31",
          "kind": "patch",
          "published_at": "2026-05-31T04:13:33Z"
        },
        {
          "tag": "v2026.5.24",
          "kind": "patch",
          "published_at": "2026-05-24T04:00:53Z"
        },
        {
          "tag": "v2026.5.17",
          "kind": "patch",
          "published_at": "2026-05-17T03:51:17Z"
        },
        {
          "tag": "v2026.5.10",
          "kind": "patch",
          "published_at": "2026-05-10T03:41:14Z"
        },
        {
          "tag": "v2026.5.3",
          "kind": "patch",
          "published_at": "2026-05-03T03:38:55Z"
        },
        {
          "tag": "v2026.4.26",
          "kind": "patch",
          "published_at": "2026-04-26T03:26:45Z"
        },
        {
          "tag": "v2026.4.19",
          "kind": "patch",
          "published_at": "2026-04-19T03:21:35Z"
        },
        {
          "tag": "v2026.4.12",
          "kind": "patch",
          "published_at": "2026-04-12T03:17:06Z"
        },
        {
          "tag": "v2026.4.5",
          "kind": "patch",
          "published_at": "2026-04-05T02:52:02Z"
        },
        {
          "tag": "v2026.3.15",
          "kind": "patch",
          "published_at": "2026-03-15T02:48:06Z"
        },
        {
          "tag": "v2026.2.15",
          "kind": "patch",
          "published_at": "2026-02-15T02:40:44Z"
        },
        {
          "tag": "v2026.2.8",
          "kind": "patch",
          "published_at": "2026-02-08T02:53:01Z"
        },
        {
          "tag": "v2026.2.1",
          "kind": "patch",
          "published_at": "2026-02-01T02:47:32Z"
        },
        {
          "tag": "v2026.1.18",
          "kind": "patch",
          "published_at": "2026-01-18T02:10:27Z"
        },
        {
          "tag": "v2026.1.4",
          "kind": "patch",
          "published_at": "2026-01-04T02:11:51Z"
        },
        {
          "tag": "v2025.12.14",
          "kind": "patch",
          "published_at": "2025-12-14T02:04:39Z"
        },
        {
          "tag": "v2025.12.7",
          "kind": "patch",
          "published_at": "2025-12-07T02:03:51Z"
        },
        {
          "tag": "v2025.11.30",
          "kind": "patch",
          "published_at": "2025-11-30T02:03:25Z"
        },
        {
          "tag": "v2025.11.16",
          "kind": "patch",
          "published_at": "2025-11-16T01:56:53Z"
        },
        {
          "tag": "v2025.11.2",
          "kind": "patch",
          "published_at": "2025-11-02T01:54:55Z"
        },
        {
          "tag": "v2025.10.26",
          "kind": "patch",
          "published_at": "2025-10-26T01:52:24Z"
        },
        {
          "tag": "v2025.10.19",
          "kind": "patch",
          "published_at": "2025-10-19T01:56:01Z"
        },
        {
          "tag": "v2025.10.12",
          "kind": "patch",
          "published_at": "2025-10-12T01:46:49Z"
        },
        {
          "tag": "v2025.9.21",
          "kind": "patch",
          "published_at": "2025-09-21T01:50:46Z"
        },
        {
          "tag": "v2025.9.14",
          "kind": "patch",
          "published_at": "2025-09-14T01:47:55Z"
        },
        {
          "tag": "v2025.9.7",
          "kind": "patch",
          "published_at": "2025-09-07T01:48:07Z"
        },
        {
          "tag": "v2025.8.31",
          "kind": "patch",
          "published_at": "2025-08-31T01:50:38Z"
        },
        {
          "tag": "v2025.8.3",
          "kind": "patch",
          "published_at": "2025-08-03T02:20:22Z"
        },
        {
          "tag": "v2025.7.20",
          "kind": "patch",
          "published_at": "2025-07-20T02:11:23Z"
        },
        {
          "tag": "v2025.7.13",
          "kind": "patch",
          "published_at": "2025-07-13T02:09:41Z"
        },
        {
          "tag": "v2025.6.29",
          "kind": "patch",
          "published_at": "2025-06-29T02:06:06Z"
        },
        {
          "tag": "v2025.6.22",
          "kind": "patch",
          "published_at": "2025-06-22T02:03:47Z"
        },
        {
          "tag": "v2025.6.15",
          "kind": "patch",
          "published_at": "2025-06-15T02:04:33Z"
        },
        {
          "tag": "v2025.6.8",
          "kind": "patch",
          "published_at": "2025-06-08T02:02:35Z"
        },
        {
          "tag": "v2025.5.21",
          "kind": "patch",
          "published_at": "2025-05-21T12:30:31Z"
        },
        {
          "tag": "v2025.4.8",
          "kind": "patch",
          "published_at": "2025-04-08T02:40:01Z"
        },
        {
          "tag": "v2025.1.30",
          "kind": "patch",
          "published_at": "2025-02-03T14:13:39Z"
        },
        {
          "tag": "v2024.12.12",
          "kind": "patch",
          "published_at": "2024-12-12T11:56:04Z"
        },
        {
          "tag": "v2024.12.06",
          "kind": "patch",
          "published_at": "2024-12-06T02:56:47Z"
        },
        {
          "tag": "v2024.11.4",
          "kind": "patch",
          "published_at": "2024-11-04T11:36:10Z"
        },
        {
          "tag": "v2024.10.14",
          "kind": "patch",
          "published_at": "2024-10-14T11:39:13Z"
        },
        {
          "tag": "v20240228",
          "kind": "other",
          "published_at": "2024-02-28T12:32:25Z"
        },
        {
          "tag": "dl-0.1.0",
          "kind": "other",
          "published_at": "2023-12-15T04:39:37Z"
        },
        {
          "tag": "cloudevents-server-0.1.0",
          "kind": "other",
          "published_at": "2023-12-15T04:39:36Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "0a4fa748fa14c8abec5ca89e765807205fa6dd17",
          "body": "## Summary\n- read TCMS resource_allocation icost_* source columns and map them back\nto existing Cost Insight attribution dimensions\n- read AWS project labels from tag_icost_project during summary and\nunmatched resource collection\n- update TCMS allocation docs and tests for the new source schema\n\n## Tests\n- python -m pytest\n- python -m ruff check src tests/test_aws_billing_export.py\ntests/test_refresh_attribution_daily.py\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(cost-insight): read icost allocation labels (#580)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-07-24T00:35:19Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e88ded86aa2fcae12fedf072485008e81badde73",
          "body": "## Summary\n- merge the cost trend/stack experience with drilldown-aware SKU class\nand team attribution views\n- add unmatched resource filters/sorting and the Unattached Block\nVolumes table for AWS EBS and GCP disks\n- add the `sync-unattached-block-volumes` scanner, SQL 029 snapshot\ntable, cronjob re\n[…]\n1-gabcdef0\n--aws-ebs-regions us-west-2 --aws-ebs-account-id 123456789012\n--service-account ci-dashboard --ca-secret ci-dashboard-ca --suspend\ntrue >/tmp/ci-dashboard-sync-unattached-block-volumes.yaml",
          "is_bot": false,
          "headline": "feat(ci-dashboard): refine cost dashboard attribution views (#579)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-07-23T02:21:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bdd4a4eec3decfc38fd0b1e59c23897c40ccb5ef",
          "body": "…loudconfig (#578)\n\nImprove logging in `UpdateComponentVersionInCloudconfig` and\n`callOpsPlatformAPI` to help diagnose HTTP 500 errors.\n\n### Changes\n\n**`UpdateComponentVersionInCloudconfig`** — Added\n`s.Logger.Error().Err(err)` before every error return, with `stage` /\n`image` context fields.\n\n**`ca\n[…]\n. Error log when Ops API returns non-2xx status, with `status` and\n`response_body`\n5. Error log when response `instance_id` is invalid (<= 0)\n6. Info log on success with `instance_id` and `ticket_url`",
          "is_bot": false,
          "headline": "feat(publisher): add structured logging for UpdateComponentVersionInC…",
          "author_name": "wuhuizuo",
          "author_login": "wuhuizuo",
          "committed_at": "2026-07-21T10:12:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4bf26eac0f2873cc35337a64ba895cb60f55228f",
          "body": "## Summary\n- add minimal `usage_type` and `cost_driver_key` dimensions to cost\nsummary and attribution tables\n- classify AWS/GCP billing summary rows into compute/block\nstorage/NAT/data transfer/object storage/logs/other without changing\n`source_row_hash`\n- expose `Driver` as a Cost breakdown share/\n[…]\n-from-summary --start-date <usage-start>\n--end-date <usage-end> --split-by-day`\n- verify `/api/v1/pages/cost-share?dimension=cost_driver` and\n`/api/v1/pages/cost-repo-group-stack?group_by=cost_driver`",
          "is_bot": false,
          "headline": "feat(dashboard): add cloud cost driver dimension (#577)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-07-21T06:58:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d6e915f3b11cfa7a86621efadac03bccd6ac62a7",
          "body": "## Summary\n- replace the `(no region)` catch-all with ingestion-time GCP region\nbuckets written into `region`\n- keep real `location.region` values unchanged\n- map empty GCP region rows from `location.location` and SKU signals to\n`multi-region`, `cross-region`, `global` when `location.location =\n'glo\n[…]\nPATH=src pytest --no-cov tests/test_sync_gcp_billing_summary.py\ntests/test_sync_gcp_billing_export.py\ntests/test_backfill_cost_refine_from_raw.py\ntests/test_refresh_attribution_daily.py`\n  - 44 passed",
          "is_bot": false,
          "headline": "fix(cost-dashboard): bucket GCP regionless billing rows (#576)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-07-21T06:34:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a2e1294af19f130ffd78229f2e5395ed4014415f",
          "body": "…(#575)\n\n## Summary\n- add region as a first-class cost dimension through cost-insight\nsummary, attribution, and dashboard APIs\n- add cost share UI/dashboard breakdown updates, including region\nhighlighting and canonical owner grouping\n- make author-derived owner mean roster-resolved resource user, w\n[…]\n_pods_build_matching_helpers_cover_jenkins_paths`\n- failure appears unrelated/date-sensitive: fixture uses 2026-04-20\nwhile current date is 2026-07-21, exceeding the 90-day Jenkins\npod-prefix lookback",
          "is_bot": false,
          "headline": "feat(cost-dashboard): add region and canonical owner cost dimensions …",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-07-21T02:51:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "615053d56849ed757b394e2794089f4c1837fd07",
          "body": "## Summary\n- select flaky GitHub issues by exact `flaky-test` label membership\ninstead of title prefixes\n- clean up derived flaky issues and PR links that no longer belong to\nthe label-backed source set\n- guard stale cleanup when the source set is empty or suspiciously small\ncompared with existing d\n[…]\n# Note\n- Full `PYTHONPATH=src ./.venv/bin/python -m pytest` still has one\nunrelated date-sensitive failure in\n`tests/jobs/test_sync_pods.py::test_sync_pods_build_matching_helpers_cover_jenkins_paths`.",
          "is_bot": false,
          "headline": "fix(ci-dashboard): filter flaky issues by label (#574)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-07-20T10:52:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5c3f3701b8758833d3120ec9e9b5b43411db0a1c",
          "body": "## Summary\n- classify ghpr_check2 SQL test diff failures as UT/TEST_FAILURE before\npod or agent noise\n- classify rules_cc Bazel toolchain attribute mismatches as\nBUILD/DEPENDENCY before node shutdown noise\n- add regression coverage for both Jenkins examples\n\n## Tests\n- PYTHONPATH=src python3 -m pytest tests/jobs/test_rule_engine.py\ntests/jobs/test_analyze_errors.py\n- PYTHONPATH=src python3 -m ruff check\nsrc/ci_dashboard/jobs/error_taxonomy.json tests/jobs/test_rule_engine.py",
          "is_bot": false,
          "headline": "fix(ci-dashboard): classify additional Jenkins error patterns (#572)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-07-15T13:08:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7acb7f937265232fd704b4f9a49cb074fe0d3d18",
          "body": "## Summary\n- add AWS TCMS label allocation support using `vendor_tags_json` with\ncurrent `shared_pool` and `cluster` keys\n- match TCMS allocation tags by subset containment and pick the\nmost-specific allocation first, so `{shared_pool, cluster}` wins before\n`{shared_pool}`\n- prefer TCMS `vendor_tags\n[…]\nlocation rows use\n`allocate_method='vendor_tag'`; cluster-key allocation matches keep\n`allocate_method='logical'`\n\n## Tests\n- `python -m ruff check src tests`\n- `python -m pytest`\n- `git diff --check`",
          "is_bot": false,
          "headline": "feat(cost-insight): add TCMS label allocation (#571)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-07-15T09:27:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ed3a74eb956fb9037d0f60c6eac14e368f2de5a3",
          "body": "## Summary\n- add optional Lark linked-organization roster sync via trust party\nvisible organization API\n- pass collaboration tenant keys from config/CLI and document the\nrequired env/scopes\n- allow cost attribution to match inactive roster employees, preserving\nattribution for departed users\n\n## Tes\n[…]\nust_party:collaboration.tenant:readonly to read visible organizations\n- visible organization responses do not include GitHub custom attrs, so\nlinked-org GitHub ID mapping still needs a separate source",
          "is_bot": false,
          "headline": "feat(roster): sync linked organization members (#570)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-07-13T05:54:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2754b231ede85d980721f636c7da97106b582377",
          "body": "## Summary\n- include legacy flaky issue titles that start with `flaky test `\nwithout a colon\n- parse legacy titles into the real testcase name so issue-filtered\nflaky tables can match problem_case_runs\n- add regression coverage for `flaky test TestSomeOfStoreUnsupported`\n\n## Tests\n- `PYTHONPATH=src ./.venv/bin/python -m pytest\ntests/jobs/test_sync_flaky_issues.py -q`\n- `PYTHONPATH=src ./.venv/bin/python -m ruff check src tests`\n- `make PYTHON=./.venv/bin/python test`",
          "is_bot": false,
          "headline": "fix(ci-dashboard): include legacy flaky test issue titles (#569)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-07-13T03:32:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "99f47106ffe34f957162783b0ff3b7cd2027c946",
          "body": "## Summary\n- Skip Prow jobs that cannot be inserted into the prow_jobs table\nbecause required fields are missing or outside the DB enum\n- Log a small sample of skipped jobs so the crawler can finish\nsuccessfully while still surfacing bad source records\n- Add Deno tests for missing status fields and \n[…]\nt.ts\n- Read-only live check against https://prow.tidb.net: 8123 jobs fetched,\n8120 insertable, 3 skipped due to missing status.state\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(insight): skip invalid prow jobs (#567)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-07-11T03:06:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "15b244e9c47c321a319ac4d11abbef6fc6eef9ab",
          "body": "## Summary\n- refresh Google credentials before each Storage Batch Operations\npolling request\n- refresh and retry once when a polling request returns 401, covering\nexpired access tokens during long-running delete jobs\n- add regression coverage for auth refresh while waiting for batch\ndelete jobs\n\n## Tests\n- python -m pytest tests/test_storage_batch_operations.py -q --no-cov\n- python -m ruff check src tests\n- python -m pytest -q",
          "is_bot": false,
          "headline": "fix(cost-insight): refresh storage batch polling token (#566)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-07-07T05:04:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b0db90551aff4795a2578107e02517037001286f",
          "body": "…#565)",
          "is_bot": false,
          "headline": "feat: replace fileserver worker with image worker and update config (…",
          "author_name": "wuhuizuo",
          "author_login": "wuhuizuo",
          "committed_at": "2026-07-06T10:51:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5887e97560160987bfe2a54aec0b537e7da0adc5",
          "body": "## Summary\n- optimize cas-from-index cleanup around orphan-first CAS selection and\nlinked AC cascade\n- add post-delete AC reference catch-up freshness gate and live by_ac\nrecheck before CAS delete\n- document race/cost tradeoffs and add behavior coverage for live ref\nblocking\n\n## Tests\n- python -m pytest tests/test_cleanup_gcs_cache.py -q --no-cov\n- python -m ruff check src tests\n- python -m pytest -q\n\nCompanion ops change: https://github.com/PingCAP-QE/ee-ops/pull/2097",
          "is_bot": false,
          "headline": "fix(cost-insight): harden gcs cache cleanup (#564)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-07-06T09:39:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9b2220c4aa20144e8894ad537987399a8d11a045",
          "body": "Format the devbuild Lark notification template:\n\n- Trim whitespace after `{{- with .GithubRepo }}` to avoid trailing\nspaces\n- Wrap Docker images and binaries lists in YAML code blocks\n- Remove backticks from individual list items (already inside code\nblock)",
          "is_bot": false,
          "headline": "fix(tibuild-v2): format lark notification template (#563)",
          "author_name": "wuhuizuo",
          "author_login": "wuhuizuo",
          "committed_at": "2026-07-06T07:54:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0057031205dbad1acafecfc40c3f35aba685fcc8",
          "body": "## Summary\n- parallelize GCS cache AC reference catch-up by shard with a BigQuery\nDML worker cap\n- keep GCS download and HTTP pool concurrency bounded while preserving\npool floor semantics\n- add shard-scoped missing-AC reconciliation and failure logging with\ntraceback\n\n## Tests\n- pytest --no-cov cos\n[…]\nst_config.py\ncost-insight/tests/test_cleanup_gcs_cache.py\ncost-insight/tests/test_sync_gcs_cache_ac_references.py\ncost-insight/tests/test_gcs_objects.py\ncost-insight/tests/test_gcs_cache_references.py",
          "is_bot": false,
          "headline": "fix(cost-insight): parallelize GCS cache catch-up safely (#562)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-07-05T12:46:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "579b709206984dda13b883d80c45d2fd53fab8ea",
          "body": "## Summary\n- raise the default CAS cleanup byte cap from 1 TiB to 50 TiB\n- keep the env override path unchanged\n- update config tests and the CAS GC v3 doc references\n\n## Tests\n- cd cost-insight && python -m ruff check .\n- cd cost-insight && python -m pytest -q",
          "is_bot": false,
          "headline": "fix(cost-insight): raise CAS cleanup byte cap (#561)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-07-05T00:09:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0e996261b5a9caf1e9c68e2f853ff718f302a8db",
          "body": "## Summary\n- raise CAS preselect window to at least the effective CAS delete cap\n- keep the explicit preselect knob as a higher manual tuning value\n- add regression coverage for a 5,000,000 CAS delete cap\n\n## Tests\n- cd cost-insight && python -m ruff check .\n- cd cost-insight && python -m pytest -q",
          "is_bot": false,
          "headline": "fix(cost-insight): align CAS preselect with delete cap (#560)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-07-04T00:21:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "52245cfe4f8ae4de495330006d78c8eabdca8f78",
          "body": "## Summary\n- fix cas-from-index stale AC reconciliation by returning object_name\nfrom stale AC candidate query\n- add a regression test for the metadata-stage column contract\n\n## Why\nThe merged #557 image failed after completing incremental catch-up\nbecause stale_ac_candidates exposed ac_object_name \n[…]\ntage reads object_name.\n\n## Validation\n- python -m ruff check\ncost-insight/src/cost_insight/jobs/cleanup_gcs_cache.py\ncost-insight/tests/test_cleanup_gcs_cache.py\n- cd cost-insight && python -m pytest",
          "is_bot": false,
          "headline": "fix(cost-insight): alias stale AC candidates for metadata stage (#559)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-07-03T13:57:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "343ff7351a49fb28aac205c18c7f2612b9696b3a",
          "body": "…s (#558)\n\n### Summary\n\nAdd configuration hot-reload capability to avoid service restart when\nconfig files change.\n\n### Changes\n\n- **pkg/reload/watcher.go**: Generic file polling watcher — checks\nconfig file `ModTime` every 30s and triggers a reload callback on\nchange.\n- **GCS service**: Added `Relo\n[…]\nWithCancel` on shutdown.\n\n### Usage\n\n```bash\n# Start without GCS config\n./server\n\n# Later create gcs.yaml — service picks it up within 30s without restart\necho \"credentials_json: '...'\" > gcs.yaml\n```",
          "is_bot": false,
          "headline": "feat(dl): add config hot-reload support for GCS, KS3, and OCI service…",
          "author_name": "wuhuizuo",
          "author_login": "wuhuizuo",
          "committed_at": "2026-07-03T11:07:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5daad32b0df4212cf1d397b8999044bb3eb91974",
          "body": "## Summary\n- make cas-from-index --max-delete-objects cap CAS candidates instead of\nAC refs\n- add ready CAS filtering so CAS with warm or unresolved AC refs is\nskipped\n- expand all cold AC refs for ready CAS before CAS deletion\n- clarify cleanup-gcs-cache cap flag help text\n\n## Notes\n- dry-run skips\n[…]\nython -m ruff check\ncost-insight/src/cost_insight/jobs/cleanup_gcs_cache.py\ncost-insight/src/cost_insight/jobs/cli.py\ncost-insight/tests/test_cleanup_gcs_cache.py\n- cd cost-insight && python -m pytest",
          "is_bot": false,
          "headline": "fix(cost-insight): cap index cleanup by CAS candidates (#557)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-07-03T11:02:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "efdbc8b8a51dd6213f5d1b6d0cf53bc933b1bf32",
          "body": "## Summary\n\n- Fix `cas-from-index` dry-run temp `by_cas` table DDL by placing\n`CLUSTER BY` before `OPTIONS`.\n- Add a regression assertion for the generated SQL order.\n\n## Why\n\nManual dry-run with relaxed AC reference staleness failed in BigQuery:\n\n```text\nSyntax error: Expected end of input but got \n[…]\n\n- `python -m ruff check\ncost-insight/src/cost_insight/jobs/cleanup_gcs_cache.py\ncost-insight/tests/test_cleanup_gcs_cache.py`\n- `cd cost-insight && python -m pytest` (`174 passed`, coverage\n`92.61%`)",
          "is_bot": false,
          "headline": "fix(cost-insight): order clustered dry-run table options (#556)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-07-03T09:38:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6b4417e0828ccc90e3f428214020477d8732486b",
          "body": "## Summary\n- calculate cost budgets by configured fiscal budget periods instead of\ncalendar year\n- align dashboard list cost with GCP Billing report list cost by\nexcluding flexible CUD adjustment rows\n- add Services grouping to the cost stack and show chip percentages\n\n## Tests\n- PYTHONPATH=src ./.venv/bin/python -m pytest tests/api/test_routes.py\n-q\n- PYTHONPATH=src ./.venv/bin/python -m ruff check src tests\n- npm test\n- npm run build",
          "is_bot": false,
          "headline": "feat(cost): align budget periods and stack dimensions (#554)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-07-03T03:53:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "248ed4fe3f505d98ddd6074691dabec597128854",
          "body": "## Summary\n\n- Fix AC reference DML retry wrapper to call `execute(query,\nparameters=...)`, matching the real `execute_query` signature.\n- Tighten sync AC reference tests so fake executors use keyword-only\n`parameters`, preventing this regression from passing tests again.\n\n## Why\n\nThe bootstrap shard\n[…]\nck\ncost-insight/src/cost_insight/jobs/sync_gcs_cache_ac_references.py\ncost-insight/tests/test_sync_gcs_cache_ac_references.py`\n- `cd cost-insight && python -m pytest` (`174 passed`, coverage\n`92.61%`)",
          "is_bot": false,
          "headline": "fix(cost-insight): call BigQuery executor with keyword parameters (#551)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-07-02T12:47:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d204bef271edc4b8d7f3408ca9fdf696132c175b",
          "body": "…I (#550)\n\n## Summary\n\nAlign tibuild-v2 API naming with tibuild-v1 (camelCase JSON, uppercase\nstatus) and migrate Lark notifications from webhook to Lark IM API with\nin-place card updates.\n\n## Changes\n\n### API naming alignment with v1\n- **JSON fields**: changed from snake_case to camelCase in both\nr\n[…]\nake_case to camelCase (requires\nmigration or reset)\n- Status values now uppercase in API responses\n\n---------\n\nCo-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "fix(tibuild-v2): align API naming and add Lark notification via IM AP…",
          "author_name": "wuhuizuo",
          "author_login": "wuhuizuo",
          "committed_at": "2026-07-02T10:30:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "16bd3745f7a4bea13995b07c7ec3e494a0d77707",
          "body": "## Summary\n\nAdd HEAD request support for `ks3-obj` and `gcs-obj` paths via Goa\n`head-object` methods, enabling `wget --spider` for both services.\n\n## Changes\n\n- **dl/design/design.go**: Added `head-object` method to KS3 (HEAD\n/s3-obj/{bucket}/{*key}) and GCS (HEAD /gcs-obj/{bucket}/{*key})\nservices,\n[…]\nead-only operations using existing SDK clients and credentials.\nHEAD is additive and non-mutating.\n\n---------\n\nCo-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(dl): add head-object Goa method to KS3 and GCS services (#544)",
          "author_name": "wuhuizuo",
          "author_login": "wuhuizuo",
          "committed_at": "2026-07-02T10:13:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f65223e8300c1a1e6c507af256b072882fe73073",
          "body": "## Summary\nAdd `ignorePaths` to renovate config so renovate bot no longer monitors\nor creates dependency update PRs for `tibuild/` paths.\n\n## Changes\n- Added `ignorePaths: [\"tibuild/**\"]` to `.github/renovate.json`\n\n## Testing\nNo functional changes; renovate config syntax is validated by renovate\nbot on scan.\n\n## Risk\nLow — only affects renovate's scan scope for the `tibuild/` directory.",
          "is_bot": false,
          "headline": "chore: ignore tibuild/ in renovate scans",
          "author_name": "wuhuizuo",
          "author_login": "wuhuizuo",
          "committed_at": "2026-07-02T09:57:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a0087d60c877c09efafe7508329ce3354eaa2a8b",
          "body": "## Summary\n\nAdd `head-object` Goa method to KS3 and GCS services, mirroring the\nexisting `head-file` pattern in OCI, to support `wget --spider` mode.\n\n## Changes\n\n- **dl/design/design.go**: Add `head-object` method to KS3 (HEAD\n/s3-obj/{bucket}/{*key}) and GCS (HEAD /gcs-obj/{bucket}/{*key}) with\nsa\n[…]\npoints on existing paths; existing GET endpoints\nunchanged. Goa code regeneration matches v3.22.2.\n\n---------\n\nCo-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(dl): add head-object Goa method to KS3 and GCS (#543)",
          "author_name": "wuhuizuo",
          "author_login": "wuhuizuo",
          "committed_at": "2026-07-02T09:56:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "febd9e8692e8154a9720299cd133b8514f529950",
          "body": "…rds (#541)\n\n## Summary\n- Add --skip-ensure-tables for sync-gcs-cache-ac-references so parallel\nshard workers can skip repeated table creation/state initialization\nafter one setup run.\n- Retry idempotent AC reference BigQuery DML on transient concurrent\nupdate / table update rate limit errors.\n- Add\n[…]\nss, then parallel shard workers with\n--skip-ensure-tables.\n\n## Validation\n- cd cost-insight && python -m ruff check .\n- cd cost-insight && python -m pytest\n- pytest result: 174 passed, coverage 92.61%",
          "is_bot": false,
          "headline": "fix(cost-insight): make AC reference bootstrap safer for parallel sha…",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-07-02T09:32:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "946744d6c02d68475cfe104578c69057d9d494c9",
          "body": "## Summary\n- Add per-shard start/finish logs for sync-gcs-cache-ac-references,\nincluding source/replaced/missing/reference/parse-error counts and\nelapsed seconds.\n- Add a regression test that a shard with multiple AC batches is\nloaded/replaced once per shard, not once per batch.\n- Remove an unused i\n[…]\nb, rather than making a\nsingle pod run a wide shard range.\n\n## Validation\n- cd cost-insight && python -m ruff check .\n- cd cost-insight && python -m pytest\n- pytest result: 169 passed, coverage 92.60%",
          "is_bot": false,
          "headline": "chore(cost-insight): log AC reference shard progress (#540)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-07-02T07:11:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c8dc928b8d8c554b7068eb6da85e058027a31c6c",
          "body": "…) (#538)\n\nReplace per-run AC-driven CAS cascade with persistent dual-table index\nplus cas-from-index cleanup. 165 tests. See\ncost-insight/docs/gcs-bazel-cache-cas-gc-v3-complete-ac-expansion.md.\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cost-insight): index-based CAS GC with complete AC expansion (v3…",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-07-02T03:07:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7194caffa5c9dc1de8419d45bc406652c261e457",
          "body": "Summary:\n- Relax ci_l1_pr_events freshness threshold from 4 hours to 30 hours to\nmatch the daily github_tickets cadence.\n\nTests:\n- pytest tests/jobs/test_check_data_freshness.py",
          "is_bot": false,
          "headline": "fix(ci-dashboard): relax PR events freshness threshold (#539)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-07-02T01:38:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1cea72874315b171e19dff625f9cd7c1dbf2ec07",
          "body": "…cations (#537)\n\n## Summary\n\nAdd build report content (Git SHA, Docker Images, Binaries) to the Lark\nnotification card when a devbuild succeeds. Also fix PipelineRun result\nparsing and a design validation issue.\n\n## Changes\n\n**1. Notification card with Build Report section**\n(`notifier.go`, `devbuil\n[…]\ninternal/service/impl/` — all tests pass\n- `go build ./cmd/tibuild ./cmd/tibuild-cli` — successful\n\n---------\n\nCo-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(tibuild-v2): add build report details to devbuild success notifi…",
          "author_name": "wuhuizuo",
          "author_login": "wuhuizuo",
          "committed_at": "2026-07-01T12:58:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "16b062917847966da879bd04b25ebb9994c217a1",
          "body": "…IGHUP (#536)\n\n## Summary\n\nAdd configuration hot-reload support for tibuild-v2 service. When the\nconfig file (`config.yaml`) is updated, the service can reload\nconfiguration at runtime without restarting.\n\n## How it works\n\n- **File polling**: Background goroutine checks `config.yaml` mtime\nevery 30 \n[…]\nnal/service/impl/notifier.go` — Atomic webhookURL for safe\nconcurrent updates\n- `cmd/tibuild/init.go` — Use config.Load\n- `cmd/tibuild/main.go` — Wire up reload handlers, auto-reload\ngoroutine, SIGHUP",
          "is_bot": false,
          "headline": "feat(tibuild-v2): implement config hot-reload with file polling and S…",
          "author_name": "wuhuizuo",
          "author_login": "wuhuizuo",
          "committed_at": "2026-07-01T11:26:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "99a8c89e81c75b2c06db9b7e194ebf8a952c8674",
          "body": "## Summary\n\n- Change GCS cache delete mode to process AC-driven cascade cleanup in\ninternal AC batches.\n- Keep `max_delete_objects` as the only delete cap; CAS deletion is no\nlonger independently capped.\n- Delete each AC batch first, reconcile it, then immediately delete all\neligible CAS referenced \n[…]\ns to avoid\nwasting work on all-stale candidate windows.\n\n## Validation\n\n- `cd cost-insight && pytest` (`163 passed`, coverage `93.42%`)\n- `cd cost-insight && ruff check src tests`\n- `git diff --check`",
          "is_bot": false,
          "headline": "fix(cost-insight): batch AC-driven GCS cache cascade cleanup (#535)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-06-30T09:27:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1306453540d59058dd0f6d3a7de8e4adde8b2405",
          "body": "…ration support (#534)\n\n## Summary\n\nAdd a new GCS (Google Cloud Storage) service parallel to the existing\nKS3 service for downloading objects from GCS buckets.\n\n### Changes\n\n- **New GCS service** at `GET /gcs-obj/{bucket}/{*key}` — streams\nobjects from GCS with Content-Length and Content-Disposition\n[…]\n— generated Goa code (new)\n dl/gen/http/gcs/                   — generated Goa HTTP code (new)\n```\n\n---------\n\nCo-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(dl): add GCS object download service with Workload Identity Fede…",
          "author_name": "wuhuizuo",
          "author_login": "wuhuizuo",
          "committed_at": "2026-06-30T07:56:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a46fd9985a2e211c7456680677b051608be9d1c5",
          "body": "## Summary\n\n- Move `ContentDisposition` to `dl/pkg/attachment` as a shared package\n- Move service implementations (oci, ks3) from root to\n`dl/internal/service/`\n- Clean up dl root to only contain config files (`go.mod`, `Dockerfile`,\netc.)\n\n## Changes\n\n| Operation | File |\n|-----------|------|\n| Mod\n[…]\nattachment/\n│   ├── oci/\n│   └── ks3/\n├── gen/                 # Goa generated code\n└── design/              # Goa design files\n```\n\n## Verification\n\n- `go build ./...` passes\n- `go test ./...` passes",
          "is_bot": false,
          "headline": "refactor(dl): reorganize package structure (#533)",
          "author_name": "wuhuizuo",
          "author_login": "wuhuizuo",
          "committed_at": "2026-06-29T09:43:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "01c377ad67a7a7b3fa7e21d8fc33b7923044079f",
          "body": "## Summary\n\nImplements PR3 for FLA-217: Lark notification via Ent Hook when devbuild\nreaches terminal state.\n\n## Changes\n\n### New Files\n- `internal/service/impl/notifier.go` - `Notifier` interface and\n`LarkNotifier` webhook implementation\n- `internal/service/impl/lark_template.go` - Lark interactive\n[…]\no test ./internal/service/impl/ -v`)\n- `go vet` passes\n- Code compiles successfully\n\nRefs: FLA-217\n\n---------\n\nCo-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(tibuild-v2): add Lark notification via Ent Hook (PR3) (#530)",
          "author_name": "wuhuizuo",
          "author_login": "wuhuizuo",
          "committed_at": "2026-06-29T09:40:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "54bb57df151eda453ce5b09c412ef6474c13a588",
          "body": "## Summary\n\nFix the steady-state GCS cache cleanup delete path so stale AC rows in\n`gcs_cache_object_last_seen_current` do not consume the real daily\nlive-delete quota.\n\nYesterday's prod run showed the current behavior clearly:\n- the job seeded `5,000,000` cold AC rows\n- `4,340,290` of them were alr\n[…]\nv-report=term-missing --cov-fail-under=90'`\n- `pytest tests/test_cleanup_gcs_cache.py tests/test_db_and_cli.py -q -o\naddopts=''`\n- `git diff --check`\n\nModule coverage for `cleanup_gcs_cache.py`: `95%`",
          "is_bot": false,
          "headline": "fix(cost-insight): refill live AC cleanup target after stale rows (#532)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-06-29T06:00:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7948db896fb1e27fc2b01fece3e274a9c8361872",
          "body": "## Summary\n\nAdd `paramPluginGitRef` CloudEvent extension in tibuild's\n`newDevBuildCloudEvents()` when `PluginGitRef` is non-empty.\n\n## Changes\n\n- `cloud_event_client.go`: Add conditional\n`event.SetExtension(\"paramPluginGitRef\", dev.Spec.PluginGitRef)` after\nexisting extensions\n- `cloud_event_client_\n[…]\nnores unknown\nextensions.\n\n## Rollback\n\nRemove the `SetExtension` line — CloudEvent reverts, Tekton falls back\nto derived ref.\n\nRefs: FLA-225 PR1\n\n---------\n\nSigned-off-by: wuhuizuo <wuhuizuo@126.com>",
          "is_bot": false,
          "headline": "feat(tibuild): add paramPluginGitRef CloudEvent extension (#531)",
          "author_name": "wuhuizuo",
          "author_login": "wuhuizuo",
          "committed_at": "2026-06-26T09:45:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e2c9b202eaf337830728c7588ba87cafbfcae56d",
          "body": "## Summary\n\nReduce BigQuery append pressure in `cleanup-gcs-cache` metadata staging.\n\nThe daily cascade cleanup failed on 2026-06-25 with:\n- `403 Quota exceeded: Your table exceeded quota for imports or query\nappends per table`\n\nThe failure happened while repeatedly `WRITE_APPEND`-ing AC/CAS metadat\n[…]\neanup_gcs_cache.py`\n- `coverage run -m pytest --no-cov tests/test_cleanup_gcs_cache.py -q`\n- `coverage report --include='*/cost_insight/jobs/cleanup_gcs_cache.py'\n-m`\n  - `cleanup_gcs_cache.py`: `92%`",
          "is_bot": false,
          "headline": "fix(cost-insight): reduce cleanup stage table append pressure (#529)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-06-26T03:21:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7f8d358d76583398cd55819bf4aad78dab7df987",
          "body": "## Summary\n- align devbuild Tekton payload generation and reconciliation with typed\nPipelineRun data and normalized Git refs/SHA resolution\n- switch stored Tekton pipeline timestamps to `time.Time` and update\ntransform/update paths accordingly\n- remove the unused devbuild CloudEvent ingest endpoint \n[…]\n but not allowed to finish because the\nbroader suite did not complete promptly in this environment\n\n---------\n\nCo-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(tibuild-v2): align devbuild Tekton payload handling (#528)",
          "author_name": "wuhuizuo",
          "author_login": "wuhuizuo",
          "committed_at": "2026-06-25T13:14:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2bb223b41f35202b79efc51bf97062c25ce86a01",
          "body": "## Summary\n\nRewrites TektonReconciler to use Tekton Dashboard HTTP API and\nrobfig/cron, addressing FLA-217 PR2 requirements.\n\n## Changes\n\n### TektonReconciler (`internal/service/impl/tekton_reconciler.go`)\n- **Replaced K8s API with Tekton Dashboard HTTP API**: Queries\n`{view_url}/apis/tekton.dev/v1/\n[…]\n API, as\nrequired\n- Uses robfig/cron instead of custom ticker, as required\n- No longer requires in-cluster K8s configuration\n- Backward compatible with existing config (reconciler disabled by\ndefault)",
          "is_bot": false,
          "headline": "feat(tibuild-v2): TektonReconciler with Dashboard API + gocron v2 (#524)",
          "author_name": "wuhuizuo",
          "author_login": "wuhuizuo",
          "committed_at": "2026-06-25T10:54:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "33ef990e4c64f08d57e4fc2790f683e577fe126f",
          "body": "## Summary\n\nNormalize v26.3.* versions to v26.3.99 for the tidbcloud ops platform as\nrequested.\n\n## Changes\n\n- Added  function to handle v26.3.* version normalization\n- Added regex pattern  to match v26.3.* versions\n- Applied normalization in  function\n- Added unit tests for the normalization logic\n\n[…]\n- All existing tests pass\n- Verified that only v26.3.* versions are affected, all other versions\nremain unchanged\n\n## Risk\n\nLow risk - change is minimal and only affects v26.3.* versions as\nspecified.",
          "is_bot": false,
          "headline": "fix: normalize v26.3.* versions to v26.3.99 for ops platform (#527)",
          "author_name": "wuhuizuo",
          "author_login": "wuhuizuo",
          "committed_at": "2026-06-25T10:00:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "41b9f9827993e636ead0ac3a05e72af4b579007b",
          "body": "Add the `namespace` attribute to the TektonPipeline type, making it\nrequired alongside `name` and `status`. Update the database schema,\nGoa design, service layer, generated HTTP client/server code, and\nOpenAPI specs to include and propagate this new field.\n\n---------\n\nCo-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(tibuild-v2): add namespace field to TektonPipeline (#526)",
          "author_name": "wuhuizuo",
          "author_login": "wuhuizuo",
          "committed_at": "2026-06-25T09:12:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3d8d34f64fd6c81ead39d8c3cd16d6ee422bad7a",
          "body": "…tus (#521)\n\n## Summary\n\nImplements FLA-217 PR1: capture the `eventID` from Tekton EventListener\nresponse and store it in `TektonStatus.triggers_event_ids`.\n\n## Changes\n\n- **`devbuild_tekton.go`**: Modified `triggerTknBuild()` to extract\n`eventID` from response CloudEvent (`respEvent.Context.GetID()\n[…]\nthe existing `s.tektonCloudEventClient.Request()` which already\ndoes request/reply\n\nCloses FLA-217\n\n---------\n\nCo-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(tibuild-v2): capture eventID from Tekton response into TektonSta…",
          "author_name": "wuhuizuo",
          "author_login": "wuhuizuo",
          "committed_at": "2026-06-25T08:59:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7e11485df5ddc3487d843258d497e679e468fb77",
          "body": "## Summary\n- fix sticky flaky table overlap when the table is horizontally scrolled\n- keep sticky case-name cells opaque while preserving zebra/hover row\nstyling\n\n## Context\n- follow-up to PingCAP-QE/ee-apps#523\n- verified locally against the real dashboard DB with the long-range\nflaky page\n\n## Verification\n- `npm run build`\n- local browser check on\n`/flaky?start_date=2026-04-01&end_date=2026-06-22&repo=pingcap%2Ftidb&branch=master&issue_status=closed&granularity=day`",
          "is_bot": false,
          "headline": "fix(ci-dashboard): keep sticky flaky table cells opaque (#525)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-06-25T01:19:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "786318a437bb101556373170390ae15c8bbdd594",
          "body": "## Summary\n\n- Lock `IssueWeeklyRateTable` column geometry with a `colgroup` and\nfixed table layout.\n- Size the table from the number of weekly columns so large date ranges\nscroll horizontally without letting case names participate in auto table\nsizing.\n- Keep the sticky case-name column opaque and c\n[…]\n `ci-dashboard/web`\n- Playwright checked a long-range flaky table after horizontal scroll:\nsticky column remained 360px, hit-testing stayed on the sticky `TH`, and\ncase links stayed inside the column.",
          "is_bot": false,
          "headline": "fix(ci-dashboard): lock flaky weekly table columns (#523)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-06-24T13:48:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8ae46dc5b6d7b81cb4ab030f25d4812389cd2efa",
          "body": "…nciler, and Lark notification\" (#522)\n\nReverts PingCAP-QE/ee-apps#518",
          "is_bot": false,
          "headline": "Revert \"feat(tibuild): add EventID, direct Tekton trigger, TektonReco…",
          "author_name": "wuhuizuo",
          "author_login": "wuhuizuo",
          "committed_at": "2026-06-24T09:53:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b70aab718bd5198fbf50345111c2b6247967dba0",
          "body": "…and Lark notification (#518)\n\n## Summary\n\nThis PR implements FLA-217 PR1, PR2, and PR3:\n\n### PR1: EventID + Direct Tekton Trigger\n1. **Model**: Add `EventID` field to `TektonStatus` struct\n2. **Config**: Add `tekton_direct_trigger` config switch\n3. **CloudEventClient**: Support direct trigger to Te\n[…]\nalls back to existing behavior\n- Notification failure doesn't block build processing\n\nRef: FLA-217\n\n---------\n\nCo-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(tibuild): add EventID, direct Tekton trigger, TektonReconciler, …",
          "author_name": "wuhuizuo",
          "author_login": "wuhuizuo",
          "committed_at": "2026-06-24T09:14:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c1cc175975d42c6a803473ad7be53dc8b93e06cc",
          "body": "…emantics, archive threshold (#520)\n\n## Summary\n\nPost-merge fixes for the daily data freshness check (#514).\n\n### Fixes\n- **UTC timezone**: `run_check` and `Report` now use\n`datetime.now(timezone.utc)` to match DB naive UTC timestamps.\nPreviously the K8s pod timezone (Asia/Shanghai) caused +8h false\n[…]\nps [#2063](https://github.com/PingCAP-QE/ee-ops/pull/2063) —\nCronJob deployment\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ci-dashboard): freshness check — UTC timezone, Lark DM, skipped s…",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-06-24T08:14:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f2b6f8a4adcccfe557c339602db647c99dd789c4",
          "body": "## Summary\n\nImplement Dead Letter Queue (DLQ) mechanism for the Publisher service to\nhandle persistent failures gracefully.\n\n## Changes\n\n- Add  in  package for unified retry logic\n- Implement exponential backoff with jitter\n- Add DLQ routing to separate Kafka topic\n- Add DLQ configuration to  struct\n[…]\n-\n\nCo-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>\nCo-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(publisher): implement DLQ mechanism with retry middleware (#517)",
          "author_name": "wuhuizuo",
          "author_login": "wuhuizuo",
          "committed_at": "2026-06-24T07:34:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d6cdfe269c2fb646d7e63563eb7a60bdaef039ec",
          "body": "## Summary\n\nThis PR fixes the bug where the `platform` field was not being persisted\nwhen creating a devbuild entity in tibuild-v2.\n\n## Changes\n\n1. **devbuild_create.go**: Added `SetPlatform(p.Request.Platform)` to\nthe entity creation chain in `newBuildEntity()`\n2. **devbuild.go**: Added `SetPlatfor\n[…]\nreate and Get operations\n\n## Root Cause\n\nThe `newBuildEntity()` function was missing the `SetPlatform()` call, so\nthe platform field from the request was never being saved to the\ndatabase.\n\nFixes #515",
          "is_bot": false,
          "headline": "fix(tibuild-v2): persist platform field when creating devbuild (#516)",
          "author_name": "wuhuizuo",
          "author_login": "wuhuizuo",
          "committed_at": "2026-06-24T04:37:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "76d38e805d8ae5c7f4c97921e2a986d4f9d95eba",
          "body": "…lumn + build key fix (#514)\n\n## Summary\n\n### Freshness check (main change)\n- **14 declarative freshness checks** covering ci_l1_builds,\npod_lifecycle, prow_jobs, github_tickets, flaky_issues, pr_events,\nproblem_case_runs, cost summary tables, gcs cache sync, and\nroster_employees\n- **DATE column coe\n[…]\ning build keys\n\n8 files changed, 2270 insertions(+), 68 deletions(-)\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(ci-dashboard): daily data freshness check, flaky table sticky co…",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-06-24T04:07:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4b0ea630e452383850da84c726f1b0ee0cdcc5c3",
          "body": "…513)\n\n## Summary\n\n- ignore the cleanup job service account's own `storage.objects.get`\nevents in the final CAS raw-audit recheck\n- keep real external `storage.objects.get` / `storage.objects.create`\nevents as CAS deletion blockers\n- add SQL-shape tests for both configured and unconfigured exclusion\n[…]\n/tests -q` -> coverage 93.10%\n- generated the fixed final CAS delete SQL from the app code and ran it\nagainst the canary intermediate tables into a scratch table; result:\n`would_delete_cas_count = 63`",
          "is_bot": false,
          "headline": "fix(cost-insight): ignore cleanup metadata gets in CAS audit check (#…",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-06-23T13:47:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c1fb8802178abae2cd4018c00755139632a7aed7",
          "body": "## Summary\n- tighten target_branch label key assertions so the raw Prow key is\nmatched as its own quoted label, not as a substring of the k8s-label key\n\n## Validation\n- python -m pytest cost-insight/tests/test_gcp_billing_export.py -q\n--no-cov\n- python -m compileall -q cost-insight/src",
          "is_bot": false,
          "headline": "test(cost): assert exact target branch label keys (#512)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-06-23T13:34:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8bc3544a1c7ea0de3d071571e7d7b917161ce3a7",
          "body": "## Summary\n- assert GCP billing query builders include both target branch label\nkeys: k8s-label/prow.k8s.io/refs.base_ref and prow.k8s.io/refs.base_ref\n- update the target branch design doc to document both equivalent source\nlabels\n\n## Notes\nThe collector code merged in #508 already reads both keys,\n[…]\ns is a\ntest/docs follow-up and does not require another backfill.\n\n## Validation\n- python -m pytest cost-insight/tests/test_gcp_billing_export.py -q\n--no-cov\n- python -m compileall -q cost-insight/src",
          "is_bot": false,
          "headline": "feat(cost): cover raw prow target branch label (#510)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-06-23T13:06:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2ba749aa285a78fc8981dbabca0aab4e9dab38ed",
          "body": "## Summary\n\nFix the next CAS GC v3 canary blocker:\n\n```text\nSyntax error: Unexpected keyword CURRENT at [11:5]\n```\n\nThe CAS cleanup SQL used `current` as a table alias. BigQuery parses\n`CURRENT` as a reserved keyword in this position. This blocked the\ncanary before manifest export / Storage Batch Op\n[…]\nexport\n- reconcile deleted CAS\n\nResult: all 16 BigQuery dry-runs succeeded.\n\nThe two CAS SQLs that previously would have been parser-sensitive were\nalso validated explicitly with `bq query --dry_run`.",
          "is_bot": false,
          "headline": "fix(cost-insight): avoid reserved alias in CAS cleanup SQL (#511)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-06-23T13:05:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dfbc0eadd7f99860115f0ec95ff98541b880f5e7",
          "body": "## Summary\n\nFix the next CAS GC v3 canary blocker found after releasing the metadata\nDDL separator fix.\n\nThe canary failed before manifest export / Storage Batch Operations\ncreation with:\n\n```text\nProvided Schema does not match Table ... _tmp_gcs_cache_run_ac_cas_refs_...\nField ac_object_name has ch\n[…]\nst -q\npython -m ruff check .\npython -m ruff format --check ../cost-insight/src/cost_insight/jobs/cleanup_gcs_cache.py ../cost-insight/tests/test_cleanup_gcs_cache.py\n```\n\nFull test coverage: `93.07%`.",
          "is_bot": false,
          "headline": "fix(cost-insight): align GCS cleanup run reference schema (#509)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-06-23T12:38:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0998751e128cdde944ef05ad7d911bc4d6b48ef9",
          "body": "## Summary\n- add nullable target_branch to cost fact/refine tables and populate it\nfrom the existing GCP billing label k8s-label/prow.k8s.io/refs.base_ref\n- carry target_branch through raw, summary, unmatched-resource, and\nattribution refresh paths, including stable hashes/upserts\n- expose branch fi\n[…]\n2026 data with the new target_branch dimension.\nUse --replace-existing-partitions for summary reruns; use\nsync-gcp-billing-export --replace-existing-dates only if raw historical\ndetails are refreshed.",
          "is_bot": false,
          "headline": "feat(cost): add target branch cost dimension (#508)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-06-23T11:50:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7708e639dd24e190436dcfa5b3c59ac1bc594a14",
          "body": "## Summary\n\nFix the CAS GC v3 canary blocker where the metadata stage table setup\ngenerated multiple `CREATE OR REPLACE TABLE` statements without\nsemicolon separators.\n\nBigQuery rejected the query as:\n\n```text\nSyntax error: Expected end of input but got keyword CREATE\n```\n\n## Changes\n\n- Separate the\n[…]\nst -q` passes with total coverage `92.92%`.\n- Full-directory `ruff format --check .` still reports pre-existing\nformatting differences in unrelated files, so I verified the two changed\nfiles directly.",
          "is_bot": false,
          "headline": "fix(cost-insight): separate GCS cleanup metadata DDL statements (#507)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-06-23T09:34:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "45c72a93a4339442bafd010439b52724d6e53886",
          "body": "## Summary\n- add `tikv/pd` to the flaky dashboard repo filter and load branch\noptions from the API\n- teach flaky issue sync to parse PD issue bodies for linked PRs when\ntimeline cross-references are missing\n- populate linked flaky PR metadata from `github_tickets` before falling\nback to the GitHub A\n[…]\nc/ci_dashboard/jobs/sync_flaky_issues.py\ntests/jobs/test_sync_flaky_issues.py`\n\n## Notes\n- verified live `tikv/pd` flaky issue / issue-PR / linked PR rows in the\ndashboard TiDB after targeted backfill",
          "is_bot": false,
          "headline": "feat(dashboard): Support tikv/pd flaky issue tracking (#506)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-06-23T08:33:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "30392c12fd2b193b21b0901d32cff2fb42ddfaf5",
          "body": "…#505)\n\n## Summary\n\nThis follow-up fixes the CAS GC v3 behavior after #504:\n\n- remove the full AC reference index readiness/freshness gate from\ncleanup\n- parse only the AC objects selected in the current cleanup run\n- populate a short-lived per-run `run_ac_cas_refs` table from those\nparsed AC object\n[…]\nhe.py\ncost-insight/tests/test_gcs_cache_references.py\ncost-insight/tests/test_sync_gcs_cache_ac_references.py\ncost-insight/tests/test_db_and_cli.py`\n- `pytest cost-insight/tests -q` (coverage: 92.92%)",
          "is_bot": false,
          "headline": "fix(cost-insight): remove global AC index dependency from CAS GC v3 (…",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-06-23T07:54:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0dd96bdffb5f62c5bcb6c7f93c43f30cc6dee3a8",
          "body": "## Summary\n\n- implement AC-driven cascading CAS GC v3 for GCS Bazel cache cleanup\n- change defaults to AC=10d and CAS=15d with the existing safety buffer\n- add `--ac-retention-days` and `--max-delete-cas-objects` CLI knobs\n- materialize per-run AC->CAS references before AC deletion, then delete\nCAS \n[…]\nonfig.py cost-insight/tests/test_db_and_cli.py`\n- `pytest cost-insight/tests -q` (coverage 92.96%)\n\n---------\n\nCo-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(cost-insight): implement AC-driven GCS CAS GC v3 (#504)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-06-23T04:04:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6d8b47673c827430ba195aa9a737b779875ffa8d",
          "body": "## Summary\n- add `ci_l1_flaky_linked_prs` as a dashboard-owned PR metadata table\nfor flaky linked PRs\n- sync linked PR metadata from GitHub when processing flaky issue links\nand during link backfill\n- compute flaky issue fix progress from the owned linked PR table\ninstead of `github_tickets(type='pu\n[…]\n`)\n- `cd ci-dashboard && python -m ruff check src tests`\n- `cd ci-dashboard && PYTHONPATH=src python -m pytest\n--cov=src/ci_dashboard --cov-report=term-missing` (`406 passed`, total\ncoverage `91.29%`)",
          "is_bot": false,
          "headline": "fix(ci-dashboard): track flaky linked PR metadata (#503)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-06-22T13:42:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d4b9f4f31f3b5b87e69a3f37283aa8664d34f310",
          "body": "## Summary\n- expand the GCS storage client HTTP pool used by AC reference indexing\n- size the pool from `ac_reference_download_workers` so\nbootstrap/incremental runs stop bottlenecking on the default pool size\nof 10\n- add focused tests for pool expansion and worker-to-pool propagation\n\n## Context\nDu\n[…]\nst_gcs_cache_references.py --no-cov -q`\n- `python -m ruff check src/cost_insight/common/gcs_cache_references.py\ntests/test_gcs_cache_references.py`\n- `python -m pytest -q`\n  - total coverage: `92.89%`",
          "is_bot": false,
          "headline": "fix(cost-insight): expand gcs client http pool for ac indexing (#502)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-06-22T12:23:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "32e23c9b14cca8fb02a96f90e2929f3f6cdf0566",
          "body": "## Summary\n- fail closed when the AC reference index is too stale for CAS cleanup\n- keep the existing bootstrap readiness check and add an index freshness\ncheck\n- make the freshness window configurable in GCS cache settings\n\n## Details\n- extend the cleanup index readiness query to return oldest/newe\n[…]\nST_INSIGHT_GCS_CACHE_AC_REFERENCE_MAX_INDEX_STALENESS_HOURS` to `12`\n- add coverage for stale-index failure and config loading\n\n## Testing\n- `pytest -q` in `cost-insight/`\n  - total coverage: `92.22%`",
          "is_bot": false,
          "headline": "fix(cost-insight): gate cas cleanup on fresh ac index (#501)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-06-22T09:12:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "45db1ba5bf55511c090f0e1cfd7380551dd902e4",
          "body": "## Summary\n\nThis PR introduces `CAS GC v2` for the GCS-backed Bazel cache and also\nfolds in a few review-driven fixes in `dl`, `tibuild`, and\n`chatops-lark`.\n\n### cost-insight\n- add `sync-gcs-cache-ac-references --mode bootstrap|incremental`\n- add persistent `AC -> CAS` reference index tables and sh\n[…]\nble CAS count\n8. Run a small real delete canary.\n9. If the canary looks clean, replace the old steady-state AC delete\nflow with:\n   - daily incremental AC reference sync\n   - daily CAS cascade cleanup",
          "is_bot": false,
          "headline": "feat(cost-insight): add bazel cache CAS GC v2 (#499)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-06-22T08:11:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "10d5bb863ffc79374d521ad1426478765587104e",
          "body": "Add two mcp servers:\n* tidb-pr-mcp\n* knowledge-base-mcp",
          "is_bot": false,
          "headline": "feat(mcp-servers): add mcp servers (#270)",
          "author_name": "Purelind",
          "author_login": "purelind",
          "committed_at": "2026-06-20T21:54:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ade3d636580d3c049224724ef58365de56e69c5c",
          "body": "…r (#498)\n\n## Summary\nFix Content-Disposition header to include both `filename` (ASCII\nfallback) and `filename*` (UTF-8 encoded) per RFC 6266. This ensures\nwget compatibility with `--content-disposition` flag.\n\n## Problem\nwget downloads were saving files with URL-derived names (e.g.,\n`package?tag=..\n[…]\nanges header format, no functional change\n- Rollback: revert to previous header format\n\nFixes: wget filename issue reported by Flare\nRef: FLA-204\n\n---------\n\nSigned-off-by: wuhuizuo <wuhuizuo@126.com>",
          "is_bot": false,
          "headline": "fix(dl): add both filename and filename* to Content-Disposition heade…",
          "author_name": "wuhuizuo",
          "author_login": "wuhuizuo",
          "committed_at": "2026-06-19T15:25:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "65aa9a26696291e0853ebd0e4d07c1417ed2066e",
          "body": "## Summary\nRefactor HEAD request support using Goa DSL `head-file` method with\nnative HEAD verb routing, replacing the previous middleware approach.\n\n## Changes\n- **`dl/design/design.go`**: Add `head-file` method with\n`HEAD(\"/oci-file/{*repository}\")` route\n- **`dl/gen/*`**: Regenerated by `goa gen`\n[…]\n96 (superseded by this refactored version)\nRef: FLA-204\n\n---------\n\nSigned-off-by: wuhuizuo <wuhuizuo@126.com>\nCo-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(dl): refactor HEAD support via Goa head-file method (v4) (#497)",
          "author_name": "wuhuizuo",
          "author_login": "wuhuizuo",
          "committed_at": "2026-06-18T13:00:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "472cc798741d152b605e5ec6fab049b5b663f940",
          "body": "## Summary\nAdd HEAD request support for the `/oci-file/{repository}` endpoint to\nenable `wget --spider` file existence checks.\n\n## Changes\n- **Export `FetchFileDescriptor`** in `dl/pkg/oci/download.go` — allows\nHEAD middleware to check file existence without downloading blob\n- **Export `GetTargetRep\n[…]\nd on `/oci-file/` path\nprefix. GET requests pass through unchanged.\n- **Rollback**: Remove `headOCIMiddleware` wrapper from handler chain.\n\nRef: FLA-204 PR1\n\nSigned-off-by: wuhuizuo <wuhuizuo@126.com>",
          "is_bot": false,
          "headline": "feat(dl): add HEAD request support for oci-file endpoint (#496)",
          "author_name": "wuhuizuo",
          "author_login": "wuhuizuo",
          "committed_at": "2026-06-18T10:16:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e96ec3c07e3e40c7af1e3010c10f03737834f86f",
          "body": "## Summary\n\nChange the default build engine from `jenkins` to `tekton` for the\ndev-build feature across all three projects.\n\n## Changes\n\n### tibuild v1 (`./tibuild`)\n- `pkg/rest/service/dev_build_service.go`: Simplified `fillWithDefaults`\nto always default to `TektonEngine` (removed product-specific\n[…]\nated tests to expect `tekton` as default engine\n\n## Testing\nAll tests pass for all three projects.\n\n---------\n\nCo-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat: change default build engine to tekton for dev-build (#495)",
          "author_name": "wuhuizuo",
          "author_login": "wuhuizuo",
          "committed_at": "2026-06-18T09:41:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "305637e6dd1faa2d65d21a69a806b33976e8506f",
          "body": "## Summary\n- exclude Storage Batch Operations `TransferService` GET audit events\nfrom `sync-gcs-cache-last-seen`\n- make the exclusion configurable in `GcsCacheSettings`, with\n`TransferService` as the default excluded user agent\n- add tests for the new query filter and settings wiring\n\n## Why\nDuring \n[…]\nwhich makes\nrecently deleted objects look hot again.\n\nThis change filters those self-generated delete-side GET events out of\nthe daily last-seen sync.\n\n## Testing\n- `pytest`\n- Total coverage: `93.96%`",
          "is_bot": false,
          "headline": "fix(cost-insight): ignore transfer service gcs get events (#494)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-06-17T03:40:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "988cf925f91ebfa7c3e99a73e8e430e188fa96d7",
          "body": "…to v1.11.3 (#338)\n\nThis PR contains the following updates:\n\n| Package | Type | Update | Change |\n|---|---|---|---|\n|\n[ghcr.io/pingcap-qe/bases/pingcap-base](https://git.resf.org/sig_core/rocky-kiwi-descriptions/src/branch/r9)\n| final | minor | `v1.10.0` → `v1.11.3` |\n\n---\n\n### Configuration\n\n📅 **Sc\n[…]\neyJjcmVhdGVkSW5WZXIiOiI0MS4xNTYuMSIsInVwZGF0ZWRJblZlciI6IjQzLjIxOS4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->\n\nCo-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): update ghcr.io/pingcap-qe/bases/pingcap-base docker tag …",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2026-06-16T03:37:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "63e8534b8643ed6b43fa68ad4d53b301161fc41d",
          "body": "## Problem\n\nWhen chatops-lark triggers a devbuild with tekton engine (e.g.,\n`/devbuild trigger --engine tekton --platform linux --product\nticdc-newarch --edition nextgen --gitRef commit/<sha>`), tibuild\nreturns:\n\n```\ntrigger devbuild failed: {\"code\":500,\"message\":\"invalid character '\\u003c' looking \n[…]\ned `github.com/branch_commits`\nendpoint; its Bearer token acceptance on `github.com` needs verification\nafter deployment\n- For private repo support, a follow-up switch to the GraphQL API may be\nneeded",
          "is_bot": false,
          "headline": "fix(tibuild): use go-github client for branch_commits API call (#492)",
          "author_name": "wuhuizuo",
          "author_login": "wuhuizuo",
          "committed_at": "2026-06-16T03:29:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bc890d2a3a387f119580ab251c6062ab77c32802",
          "body": "## Summary\n- wait for Storage Batch Operations delete jobs to complete before\ntreating a cleanup run as successful\n- reconcile `gcs_cache_object_last_seen_current` after a fully\nsuccessful delete so already-removed objects stop reappearing in later\ndry-runs/deletes\n- add coverage for the success pat\n[…]\n objects\nagain.\n\nThis change keeps the current-table source of truth aligned with\nsuccessful delete results without introducing a separate runs table.\n\n## Testing\n- `pytest`\n- Total coverage: `92.24%`",
          "is_bot": false,
          "headline": "fix(cost-insight): reconcile gcs cache current table after delete (#491)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-06-15T13:46:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4337d12d25caad6747fd1a9d30aee4bf15b93124",
          "body": null,
          "is_bot": false,
          "headline": "chore(build): artifact sync-image api support gcr.io as target (#490)",
          "author_name": "timzxz",
          "author_login": "timzxz",
          "committed_at": "2026-06-15T09:26:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b4b9a0dddeff7d4e5dcd5782ecc53de71284ee8c",
          "body": "## Summary\n- add a one-time bootstrap command and runbooks for building GCS cache\nlast-seen state from the audit-log window\n- add steady-state GCS cache cleanup delete support with manifest export\nand Storage Batch Operations job creation\n- update cleanup defaults and CLI/config wiring for `ac=14d`,\n[…]\n_insight/common/config.py\ncost-insight/tests/test_bootstrap_gcs_cache_last_seen.py\ncost-insight/tests/test_cleanup_gcs_cache.py\ncost-insight/tests/test_config.py cost-insight/tests/test_db_and_cli.py`",
          "is_bot": false,
          "headline": "feat(cost-insight): add gcs cache cleanup workflows (#489)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-06-15T03:48:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "55918fee8841a43ebb810d3d9001e19dfe56def9",
          "body": "## Summary\n\nImplement event-driven build status update using Tekton CloudEvent\ncallbacks, following the same pattern as tibuild v1.\n\n## Changes\n\n### Core Implementation\n- **IngestEvent**: Process CloudEvent callbacks from Tekton\n- Extract DevBuild ID from PipelineRun annotations\n(tekton.dev/ce-conte\n[…]\nract DevBuild\nID\n\n## Event Type Mapping\n- dev.tekton.event.pipelinerun.started.v1 -> running\n- dev.tekton.event.pipelinerun.successful.v1 -> success\n- dev.tekton.event.pipelinerun.failed.v1 -> failure",
          "is_bot": false,
          "headline": "feat: implement event-driven build status update via IngestEvent (#488)",
          "author_name": "wuhuizuo",
          "author_login": "wuhuizuo",
          "committed_at": "2026-06-14T10:42:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "622491cdee19987f6b7c4d02676a0d465ff103b1",
          "body": "## Summary\n\nReplace proactive Tekton status sync with event-driven approach using\nCloudEvent callbacks.\n\n## Changes\n\n- **Remove**: Proactive sync code (, )\n- **Remove**: Tekton Dashboard API config (, )\n- **Implement**:  to process CloudEvent callbacks from Tekton\n- **Add**: Status extraction from e\n[…]\nxtracts status and updates the database\n\n## Test Plan\n\n- [x] Test extractBuildStatus with various status formats\n- [x] Test extractTektonStatus with/without pipeline info\n- [x] All existing tests pass",
          "is_bot": false,
          "headline": "feat: implement event-driven build status update via IngestEvent (#487)",
          "author_name": "wuhuizuo",
          "author_login": "wuhuizuo",
          "committed_at": "2026-06-14T10:16:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "eb6b4320e273ceb7600bd069a78d091567a813a9",
          "body": "## Summary\n\nImprove `getGhRefSha` function to support all git ref formats used in\nDevBuild:\n- `branch/xxx` → `Repositories.GetBranch` (existing)\n- `tag/xxx` → `Git.GetRef` (new)\n- `pull/xxx` → `PullRequests.Get` (new)\n\n## Changes\n\n- **feat**: Add tag and PR ref resolution in `getGhRefSha` function\n-\n[…]\n tag/ ref format  \n- [x] Unit tests for pull/ ref format\n- [x] Edge cases: nil client, invalid repo format, invalid PR number,\nunknown ref format\n- [x] Error scenarios: 404 not found for branch/tag/PR",
          "is_bot": false,
          "headline": "feat: support all git ref formats in getGhRefSha (#486)",
          "author_name": "wuhuizuo",
          "author_login": "wuhuizuo",
          "committed_at": "2026-06-14T09:40:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "28522eb9b2f2457b40dd04e3e983d0cb0188db84",
          "body": "## Summary\n\n- Stop reading and writing the redundant `ci_l1_builds.url` column,\nusing `normalized_build_url` as the canonical Jenkins build URL.\n- Stop persisting unused `ci_l1_pod_lifecycle.jenkins_label_digest` and\n`jenkins_controller` metadata.\n- Add follow-up schema migrations to drop the redund\n[…]\nTHONPATH=src .venv/bin/python -m pytest -q\ntests/jobs/test_sync_pods.py tests/api/test_runtime_insights.py\ntests/jobs/test_archive_error_logs.py tests/jobs/test_jenkins_worker.py\ntests/test_models.py`",
          "is_bot": false,
          "headline": "chore(dashboard): Drop redundant CI dashboard columns (#484)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-06-13T12:52:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4e0ddfa324ad032cb4ef22270aefc1c28fc4cae0",
          "body": "## Summary\n- add CI build-count breakdown charts with selectable repo, branch, and\nauthor grouping\n- add cost stack grouping by repo, author, and team, with chip-based\nfocus for one selected value\n- bump CI Dashboard version to 0.4.2\n\n## Validation\n- `uv run --extra dev coverage run -m pytest`\n- `uv\n[…]\n --extra dev ruff check src tests`\n- `npm test`\n- `npm run build`\n\n## Notes\n- Cost stack grouping is requested on demand through\n`group_by=repo|author|team` instead of fetching every grouping at once.",
          "is_bot": false,
          "headline": "feat(dashboard): Add dashboard breakdown controls (#485)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-06-13T06:25:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "680aa57de076e6fd25916e1def8254179b4e4be7",
          "body": "## Summary\n- Replace the dashboard overview with a fixed previous-complete-week\nWeekly Summary page covering CI, Cost, and Flaky signals.\n- Add CI cloud migration, weekly cost account summary, and corrected\nflaky distinct-case/reporting logic.\n- Remove the now-stable Cost/CI-details feature switches\n[…]\ngation or analyze_errors or jenkins_pod_name_url_prefix'`\n- `npm test -- --run`\n- `npm run build`\n- Live TiDB smoke for `/api/v1/pages/cost-weekly-account-summaries`\nreturned unchanged account totals.",
          "is_bot": false,
          "headline": "feat(ci-dashboard): add weekly summary dashboard (#483)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-06-12T13:56:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1049a4c7622763998ab9187e1751a3c023a9ad6b",
          "body": "## Summary\n\n- persist Jenkins subtask queue and building aggregates on canonical\nbuild rows\n- fetch `/timings/` asynchronously after finished events without\nblocking Kafka commits\n- provide a one-off 30-day backfill command instead of a recurring\nCronJob\n\n## Implementation\n\n- add five nullable Jenki\n[…]\n\n- verified the parser against Jenkins build\n`pull_br_integration_test/822`\n\n## Rollout\n\nApply migration `023_alter_ci_l1_builds_add_jenkins_timings.sql` before\ndeploying the updated Jenkins consumer.",
          "is_bot": false,
          "headline": "feat(dashboard): collect Jenkins subtask timings (#482)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-06-11T09:09:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e64e786a31edd63c3abf822bddb035d4d8e68a3c",
          "body": "## Summary\n- split generic Kubernetes infra failures into more specific categories\n- rename the evicted bucket to `K8S_STORAGE_EVICTED` and keep\n`K8S_MEMORY_EVICTION` for memory-pressure-only cases\n- enrich analyze-errors pod evidence loading via `source_prow_job_id`,\n`normalized_build_url`, and `po\n[…]\n + analyze_errors +\nguidance`): `94.87%`\n- note: `runtime.py` remains a much larger historical query module with\nlower pre-existing statement coverage; this change only touches its\nINFRA category list",
          "is_bot": false,
          "headline": "feat(dashboard): Refine generic K8S infra failure taxonomy (#481)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-06-11T08:03:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b764b8fb0e7a9eb7609303469319dfe600547c72",
          "body": "## Summary\n- add the first GCS Bazel cache cleanup slice in cost-insight with\nBigQuery-backed last-seen sync and cleanup dry-run commands\n- document the design, including create-event seeding, historical-object\nlimitations, and the inventory requirement before delete\n- add config, CLI wiring, and te\n[…]\nnsight/tests/test_sync_gcs_cache_last_seen.py\ncost-insight/tests/test_cleanup_gcs_cache.py\ncost-insight/tests/test_config.py cost-insight/tests/test_db_and_cli.py\n- python -m pytest cost-insight/tests",
          "is_bot": false,
          "headline": "feat(cost-insight): add gcs cache cleanup dry-run jobs (#480)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-06-09T14:16:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c7dad836942fd8c46bc15c29596b6a9a107cec7a",
          "body": "…478)\n\nSummary\n- make mac build claiming arch-aware so workers only adopt matching\npending builds\n- track the full preparing/building/publishing lifecycle in status\nupdates\n- stream native build stdout/stderr to controller logs while keeping a\nbounded failure tail\n\nChanges\n- claim `Pending` builds o\n[…]\nmake test`\n- `make lint`\n\nRisk\n- status updates now happen more frequently during a build, so any\nunexpected conflict handling bug would show up as stalled phase\ntransitions rather than silent success",
          "is_bot": false,
          "headline": "feat(mac-builder-operator): add arch-aware build lifecycle updates (#…",
          "author_name": "wuhuizuo",
          "author_login": "wuhuizuo",
          "committed_at": "2026-06-08T22:23:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cb9f11556f2bb9a0ba19d52eff56bf422a7cb3d5",
          "body": "…#479)\n\n## Summary\n- move the Cost tab to a source-aware filter bar and hide unrelated\nglobal filters\n- reorganize weekly overview and add a lag-aware budget pace card with\n14-day forecast logic\n- read annual budgets from `cost_budgets` for the selected source\ninstead of hardcoded values, including \n[…]\n budget health\n\n## Testing\n- PYTHONPATH=src ./.venv/bin/pytest --cov=src --cov-report=term\n- PYTHONPATH=src ./.venv/bin/ruff check src tests\n- npm run build\n- node --test web/src/lib/filterUrl.test.js",
          "is_bot": false,
          "headline": "feat(ci-dashboard): refine cost dashboard filters and budget pacing (…",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-06-07T14:03:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "025b379aaef634e65ae95ac07f1f0c5bcc5dde64",
          "body": "Summary\nAdd the PR1 API and agent identity foundation for\n`mac-builder-operator`.\n\nChanges\n- default `spec.build.arch` to `amd64` and validate `amd64|arm64`\n- extend status with `workerArch`, `phaseMessage`, and `phaseHistory`\n- add `--worker-name` and `--worker-arch` agent flags and persist them\nin\n[…]\ndownloads envtest\nassets; full suite should be validated in CI\n\nRisk\n- Low to medium: CRD/status schema expands and agent status writes\nchange, but all new fields are optional and backward compatible.",
          "is_bot": false,
          "headline": "feat: add mac-builder-operator worker arch identity foundation (#477)",
          "author_name": "wuhuizuo",
          "author_login": "wuhuizuo",
          "committed_at": "2026-06-06T07:47:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ae3b864f7258cc3a9c2b436234bb92f94e413bc0",
          "body": "Summary\n- pin the external artifacts build-script source to an immutable\nrevision for the mac-builder agent\n- verify the checked-out artifacts repo commit before running any\ngenerated build logic\n\nChanges\n- add agent flags for artifacts repo URL, revision, and expected commit\nwith safe defaults\n- re\n[…]\nourceConfig|TestCloneArtifactsRepo|TestReconcile'`\n\nRisk\n- low to medium: the agent will now fail fast if the configured\nartifacts revision/commit pair is wrong; rollback is reverting commit\n`b08f9dd`",
          "is_bot": false,
          "headline": "fix(mac-builder-operator): pin artifacts script source (#476)",
          "author_name": "wuhuizuo",
          "author_login": "wuhuizuo",
          "committed_at": "2026-06-06T06:57:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c24e79c64be0afdebc382acbb61cc1df345282fd",
          "body": "…ation for core logics (#344)\n\nThis pull request introduces the initial project scaffolding and\ndevelopment environment setup for the `mac-builder-operator`. It adds\nconfiguration files for building, testing, linting, and deploying the\noperator, as well as documentation and project metadata. The cha\n[…]\no-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>\nCo-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(mac-builder-operator): init the project and implement with simul…",
          "author_name": "wuhuizuo",
          "author_login": "wuhuizuo",
          "committed_at": "2026-06-06T06:06:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f1df263bf843829083b01e87dc912b661d855ec5",
          "body": "## Summary\n- add a `cost_sources` registry so cost sync jobs can discover active\nvendor/account sources from DB\n- add AWS billing summary and unmatched resource sync, and teach\nrefresh/CLI/job keys to work per `(vendor, account_id)` source\n- seed initial GCP and AWS cost sources and document the mul\n[…]\nght/src cost-insight/tests`\n- coverage: `95.51%`\n\n## Notes\n- the one-off backfill for `gcp/qa-infra-dev` and `aws/946646677266` was\nexecuted separately in temporary GKE jobs and is not part of this PR",
          "is_bot": false,
          "headline": "feat(cost-insight): add multi-source billing sync (#475)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-06-05T13:49:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3dd898b2193fd22dc4b7ecc6d9b3b022db61733c",
          "body": "## Summary\n- allow roster weekly summary to send the same Lark message to multiple\nopen IDs\n- add `ROSTER_LARK_NOTIFY_OPEN_IDS` alongside the existing\nsingle-recipient env var\n- cover config, CLI, and send-path behavior with tests and README\nupdates\n\n## Testing\n- python -m pytest roster/tests",
          "is_bot": false,
          "headline": "feat(roster): support multiple weekly summary recipients (#474)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-06-02T08:45:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8ecc71c51e8873b412267ff4d8a37c716f6b3261",
          "body": "## Summary\n- require final scheduling failures to come from failure-like builds\n- require completed builds to have an observed unscheduled pod window of\nat least 30 minutes before counting final scheduling failure\n- sync dashboard filters with page URL query parameters so shared links\nand refreshes \n[…]\n Validation\n- npm test\n- npm run build\n- PYTHONPATH=src python -m pytest tests/api/test_runtime_insights.py -q\n- PYTHONPATH=src python -m pytest --cov=ci_dashboard --cov-report=term\n--cov-fail-under=0",
          "is_bot": false,
          "headline": "fix(ci-dashboard): refine runtime insights and filter URLs (#473)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-06-01T09:39:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "524eb66b3dc8628404e71b83adc97abf68485f96",
          "body": null,
          "is_bot": false,
          "headline": "refactor: replace `interface{}` with `any` in Go code",
          "author_name": "wuhuizuo",
          "author_login": "wuhuizuo",
          "committed_at": "2026-05-29T11:41:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8879283da3035556f85645065ae58ec6a634862b",
          "body": "## Summary\n- add `/image-tag` config and command registration behind `image_tag`\nconfig gating\n- dispatch the `query-image-tag.yml` GitHub Actions workflow, discover\nthe run id, and poll/download `result.json`\n- render Lark replies from a dedicated poll template and cover the\ntrigger/poll flow with \n[…]\ntests\n\n## Testing\n- `docker run --rm -v\n/Users/pingcap/multica_workspaces/653ba637-3f90-422e-b29d-e6d5d36993db/ac894655/workdir/ee-apps/chatops-lark:/workspace\n-w /workspace golang:1.23 go test ./...`",
          "is_bot": false,
          "headline": "feat(chatops-lark): add /image-tag workflow integration (#455)",
          "author_name": "wuhuizuo",
          "author_login": "wuhuizuo",
          "committed_at": "2026-05-29T11:37:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "819d78cb97e2142d97f7c3564e11585a0fcb8e87",
          "body": "## Summary\n- let Runtime Insights trend panels follow the selected value from the\nleft donut charts instead of rendering every series together\n- add a right-axis share line for the selected value and make the share\naxis auto-scale so the line stays centered instead of pinning to 100%\n- bump CI Dashb\n[…]\nion from `0.3.5` to `0.3.6` across Python and\nweb package metadata\n\n## Verification\n- `cd ci-dashboard/web && npm run build`\n- local Runtime Insights page verified against the local API with real\ndata",
          "is_bot": false,
          "headline": "feat(ci-dashboard): refine runtime insight trend drilldowns (#471)",
          "author_name": "dillon",
          "author_login": "dillon-zheng",
          "committed_at": "2026-05-27T07:49:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        }
      ],
      "releases_count": 51,
      "commits_last_year": 242,
      "latest_release_at": "2026-07-19T00:44:50Z",
      "latest_release_tag": "v2026.7.19",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 37,
      "days_since_latest_release": 6,
      "mean_days_between_releases": 7
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 37,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/PingCAP-QE/ee-apps",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/PingCAP-QE/ee-apps",
          "is_deprecated": false,
          "latest_version": "v2026.7.19+incompatible",
          "repository_url": "https://github.com/PingCAP-QE/ee-apps",
          "versions_count": 48,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-15T13:08:53Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 9
        },
        {
          "name": "roster",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "youtube",
            "roster",
            "record",
            "register",
            "License :: OSI Approved :: MIT License",
            "Programming Language :: Python :: 3",
            "Programming Language :: Python :: 3.10",
            "Programming Language :: Python :: 3.11",
            "Programming Language :: Python :: 3.8",
            "Programming Language :: Python :: 3.9"
          ],
          "ecosystem": "pypi",
          "matches_repo": false,
          "registry_url": "https://pypi.org/project/roster/",
          "is_deprecated": false,
          "latest_version": "0.1.11",
          "repository_url": "https://github.com/tombulled/roster",
          "versions_count": 5,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 12603,
          "first_published_at": "2018-10-13T18:22:53.279186Z",
          "latest_published_at": "2022-10-27T20:50:06.856073Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 1366
        }
      ]
    },
    "popularity": {
      "forks": 3,
      "stars": 1,
      "watchers": 5,
      "fork_history": {
        "days": [
          {
            "date": "2025-09-25",
            "count": 1
          },
          {
            "date": "2026-03-27",
            "count": 1
          },
          {
            "date": "2026-04-15",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 3,
        "total_forks": 3
      },
      "star_history": null,
      "open_issues_and_prs": 26
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "samples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "ci-dashboard/Makefile",
        "mac-builder-operator/Makefile",
        "tibuild/Makefile"
      ],
      "api_schema_files": [
        "dl/gen/http/openapi.json",
        "dl/gen/http/openapi.yaml",
        "experiments/tibuild-v2/internal/service/gen/http/openapi.json",
        "experiments/tibuild-v2/internal/service/gen/http/openapi.yaml",
        "publisher/internal/service/gen/http/openapi.json",
        "publisher/internal/service/gen/http/openapi.yaml",
        "tibuild/docs/swagger.json",
        "tibuild/docs/swagger.yaml"
      ],
      "has_devcontainer": false,
      "typecheck_configs": [
        "mcp-servers/knowledge-base-mcp/src/vector_search/tidb_vector_ui/tsconfig.json"
      ],
      "toolchain_manifests": [
        "change-insight/go.mod",
        "chatops-lark/go.mod",
        "cloudevents-server/go.mod",
        "dl/go.mod",
        "experiments/tibuild-v2/go.mod",
        "mac-builder-operator/go.mod",
        "publisher/go.mod",
        "tibuild/go.mod"
      ],
      "largest_source_bytes": 275732,
      "source_files_sampled": 661,
      "oversized_source_files": 15,
      "agent_instruction_files": [
        "AGENTS.md"
      ],
      "agent_instruction_max_bytes": 4963
    },
    "dependencies": {
      "manifests": [
        "change-insight/go.mod",
        "chatops-lark/go.mod",
        "ci-dashboard/pyproject.toml",
        "cloudevents-server/go.mod",
        "cost-insight/pyproject.toml",
        "dl/go.mod",
        "mac-builder-operator/go.mod",
        "publisher/go.mod",
        "roster/pyproject.toml",
        "tibuild/go.mod"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "go",
        "pypi"
      ],
      "dependencies": [
        {
          "name": "github.com/gin-gonic/gin",
          "manifest": "change-insight/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.10.1"
        },
        {
          "name": "github.com/spf13/pflag",
          "manifest": "change-insight/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.0.6"
        },
        {
          "name": "github.com/spf13/viper",
          "manifest": "change-insight/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.19.0"
        },
        {
          "name": "gorm.io/driver/mysql",
          "manifest": "change-insight/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.5.7"
        },
        {
          "name": "gorm.io/gorm",
          "manifest": "change-insight/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.25.12"
        },
        {
          "name": "github.com/Masterminds/sprig/v3",
          "manifest": "chatops-lark/go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.3.0"
        },
        {
          "name": "github.com/allegro/bigcache/v3",
          "manifest": "chatops-lark/go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.1.0"
        },
        {
          "name": "github.com/go-resty/resty/v2",
          "manifest": "chatops-lark/go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.16.5"
        },
        {
          "name": "github.com/google/go-github/v68",
          "manifest": "chatops-lark/go.mod",
          "ecosystem": "go",
          "version_constraint": "v68.0.0"
        },
        {
          "name": "github.com/larksuite/oapi-sdk-go/v3",
          "manifest": "chatops-lark/go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.4.7"
        },
        {
          "name": "github.com/mark3labs/mcp-go",
          "manifest": "chatops-lark/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.17.0"
        },
        {
          "name": "github.com/openai/openai-go",
          "manifest": "chatops-lark/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.1.0-beta.11"
        },
        {
          "name": "github.com/rs/zerolog",
          "manifest": "chatops-lark/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.33.0"
        },
        {
          "name": "gopkg.in/yaml.v3",
          "manifest": "chatops-lark/go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.0.1"
        },
        {
          "name": "boto3",
          "manifest": "ci-dashboard/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.34.0"
        },
        {
          "name": "fastapi",
          "manifest": "ci-dashboard/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.115.0"
        },
        {
          "name": "google-cloud-storage",
          "manifest": "ci-dashboard/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.18.0"
        },
        {
          "name": "httpx",
          "manifest": "ci-dashboard/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.27.0"
        },
        {
          "name": "kafka-python-ng",
          "manifest": "ci-dashboard/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.2.3"
        },
        {
          "name": "PyMySQL",
          "manifest": "ci-dashboard/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.1.0"
        },
        {
          "name": "SQLAlchemy",
          "manifest": "ci-dashboard/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.0.0"
        },
        {
          "name": "uvicorn",
          "manifest": "ci-dashboard/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.34.0"
        },
        {
          "name": "entgo.io/ent",
          "manifest": "cloudevents-server/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.14.5"
        },
        {
          "name": "github.com/Masterminds/sprig/v3",
          "manifest": "cloudevents-server/go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.3.0"
        },
        {
          "name": "github.com/cloudevents/sdk-go/v2",
          "manifest": "cloudevents-server/go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.16.1"
        },
        {
          "name": "github.com/gin-gonic/gin",
          "manifest": "cloudevents-server/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.10.1"
        },
        {
          "name": "github.com/go-sql-driver/mysql",
          "manifest": "cloudevents-server/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.9.3"
        },
        {
          "name": "github.com/goccy/go-yaml",
          "manifest": "cloudevents-server/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.18.0"
        },
        {
          "name": "github.com/larksuite/oapi-sdk-go/v3",
          "manifest": "cloudevents-server/go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.2.8"
        },
        {
          "name": "github.com/mattn/go-sqlite3",
          "manifest": "cloudevents-server/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.14.32"
        },
        {
          "name": "github.com/pkg/errors",
          "manifest": "cloudevents-server/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.9.1"
        },
        {
          "name": "github.com/rs/zerolog",
          "manifest": "cloudevents-server/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.33.0"
        },
        {
          "name": "github.com/segmentio/kafka-go",
          "manifest": "cloudevents-server/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.4.49"
        },
        {
          "name": "github.com/tektoncd/pipeline",
          "manifest": "cloudevents-server/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.3.1"
        },
        {
          "name": "k8s.io/api",
          "manifest": "cloudevents-server/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.32.7"
        },
        {
          "name": "k8s.io/apimachinery",
          "manifest": "cloudevents-server/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.32.7"
        },
        {
          "name": "knative.dev/pkg",
          "manifest": "cloudevents-server/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0-20250415155312-ed3e2158b883"
        },
        {
          "name": "google-auth",
          "manifest": "cost-insight/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.0.0"
        },
        {
          "name": "google-cloud-bigquery",
          "manifest": "cost-insight/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=3.25.0"
        },
        {
          "name": "google-cloud-storage",
          "manifest": "cost-insight/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.19.0"
        },
        {
          "name": "protobuf",
          "manifest": "cost-insight/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=5.28.0"
        },
        {
          "name": "PyMySQL",
          "manifest": "cost-insight/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.1.0"
        },
        {
          "name": "SQLAlchemy",
          "manifest": "cost-insight/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.0.0"
        },
        {
          "name": "cloud.google.com/go/storage",
          "manifest": "dl/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.63.0"
        },
        {
          "name": "github.com/ks3sdklib/aws-sdk-go",
          "manifest": "dl/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.3.0"
        },
        {
          "name": "github.com/opencontainers/image-spec",
          "manifest": "dl/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.1.1"
        },
        {
          "name": "goa.design/clue",
          "manifest": "dl/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.2.3"
        },
        {
          "name": "goa.design/goa/v3",
          "manifest": "dl/go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.22.2"
        },
        {
          "name": "google.golang.org/api",
          "manifest": "dl/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.286.0"
        },
        {
          "name": "gopkg.in/yaml.v3",
          "manifest": "dl/go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.0.1"
        },
        {
          "name": "oras.land/oras-go/v2",
          "manifest": "dl/go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.5.0"
        },
        {
          "name": "github.com/go-logr/logr",
          "manifest": "mac-builder-operator/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.4.2"
        },
        {
          "name": "github.com/onsi/ginkgo/v2",
          "manifest": "mac-builder-operator/go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.22.0"
        },
        {
          "name": "github.com/onsi/gomega",
          "manifest": "mac-builder-operator/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.36.1"
        },
        {
          "name": "k8s.io/apimachinery",
          "manifest": "mac-builder-operator/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.34.0"
        },
        {
          "name": "k8s.io/client-go",
          "manifest": "mac-builder-operator/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.34.0"
        },
        {
          "name": "k8s.io/utils",
          "manifest": "mac-builder-operator/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0-20250604170112-4c0f3b243397"
        },
        {
          "name": "sigs.k8s.io/controller-runtime",
          "manifest": "mac-builder-operator/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.22.1"
        },
        {
          "name": "github.com/Masterminds/sprig/v3",
          "manifest": "publisher/go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.3.0"
        },
        {
          "name": "github.com/PingCAP-QE/ee-apps/dl",
          "manifest": "publisher/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0-20250828141640-8dda9c968d09"
        },
        {
          "name": "github.com/alicebob/miniredis/v2",
          "manifest": "publisher/go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.34.0"
        },
        {
          "name": "github.com/cloudevents/sdk-go/v2",
          "manifest": "publisher/go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.15.2"
        },
        {
          "name": "github.com/go-redis/redis/v8",
          "manifest": "publisher/go.mod",
          "ecosystem": "go",
          "version_constraint": "v8.11.5"
        },
        {
          "name": "github.com/go-redsync/redsync/v4",
          "manifest": "publisher/go.mod",
          "ecosystem": "go",
          "version_constraint": "v4.13.0"
        },
        {
          "name": "github.com/go-resty/resty/v2",
          "manifest": "publisher/go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.16.5"
        },
        {
          "name": "github.com/google/go-containerregistry",
          "manifest": "publisher/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.20.6"
        },
        {
          "name": "github.com/google/uuid",
          "manifest": "publisher/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.6.0"
        },
        {
          "name": "github.com/rs/zerolog",
          "manifest": "publisher/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.33.0"
        },
        {
          "name": "github.com/segmentio/kafka-go",
          "manifest": "publisher/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.4.49"
        },
        {
          "name": "goa.design/clue",
          "manifest": "publisher/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.2.3"
        },
        {
          "name": "goa.design/goa/v3",
          "manifest": "publisher/go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.23.2"
        },
        {
          "name": "goa.design/plugins/v3",
          "manifest": "publisher/go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.23.0"
        },
        {
          "name": "golang.org/x/mod",
          "manifest": "publisher/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.30.0"
        },
        {
          "name": "gopkg.in/yaml.v3",
          "manifest": "publisher/go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.0.1"
        },
        {
          "name": "oras.land/oras-go/v2",
          "manifest": "publisher/go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.5.0"
        },
        {
          "name": "github.com/ks3sdklib/aws-sdk-go",
          "manifest": "publisher/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.3.0"
        },
        {
          "name": "github.com/opencontainers/image-spec",
          "manifest": "publisher/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.1.1"
        },
        {
          "name": "github.com/stretchr/testify",
          "manifest": "publisher/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.11.1"
        },
        {
          "name": "PyMySQL",
          "manifest": "roster/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.1.0"
        },
        {
          "name": "SQLAlchemy",
          "manifest": "roster/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.0.0"
        },
        {
          "name": "github.com/DATA-DOG/go-sqlmock",
          "manifest": "tibuild/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.5.2"
        },
        {
          "name": "github.com/bndr/gojenkins",
          "manifest": "tibuild/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.1.0"
        },
        {
          "name": "github.com/cloudevents/sdk-go/v2",
          "manifest": "tibuild/go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.16.1"
        },
        {
          "name": "github.com/deckarep/golang-set/v2",
          "manifest": "tibuild/go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.8.0"
        },
        {
          "name": "github.com/dougsland/jenkinsctl",
          "manifest": "tibuild/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.1"
        },
        {
          "name": "github.com/gin-contrib/requestid",
          "manifest": "tibuild/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.0.5"
        },
        {
          "name": "github.com/gin-contrib/static",
          "manifest": "tibuild/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.1.5"
        },
        {
          "name": "github.com/gin-gonic/gin",
          "manifest": "tibuild/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.10.1"
        },
        {
          "name": "github.com/google/go-github/v61",
          "manifest": "tibuild/go.mod",
          "ecosystem": "go",
          "version_constraint": "v61.0.0"
        },
        {
          "name": "github.com/jinzhu/configor",
          "manifest": "tibuild/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.2.2"
        },
        {
          "name": "github.com/rs/zerolog",
          "manifest": "tibuild/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.33.0"
        },
        {
          "name": "github.com/stretchr/testify",
          "manifest": "tibuild/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.10.0"
        },
        {
          "name": "github.com/swaggo/files",
          "manifest": "tibuild/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.0.1"
        },
        {
          "name": "github.com/swaggo/gin-swagger",
          "manifest": "tibuild/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.6.1"
        },
        {
          "name": "github.com/swaggo/swag",
          "manifest": "tibuild/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.16.4"
        },
        {
          "name": "github.com/tektoncd/pipeline",
          "manifest": "tibuild/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.3.1"
        },
        {
          "name": "gopkg.in/yaml.v3",
          "manifest": "tibuild/go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.0.1"
        },
        {
          "name": "gorm.io/driver/mysql",
          "manifest": "tibuild/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.5.7"
        },
        {
          "name": "gorm.io/gorm",
          "manifest": "tibuild/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.25.12"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 21,
        "merged_prs": 494,
        "open_issues": 5,
        "closed_ratio": 0.706,
        "closed_issues": 12,
        "closed_unmerged_prs": 47
      },
      "bus_factor": 1,
      "bot_contributors": 4,
      "top_contributors": [
        {
          "type": "User",
          "login": "wuhuizuo",
          "commits": 257,
          "avatar_url": "https://avatars.githubusercontent.com/u/2574558?v=4"
        },
        {
          "type": "User",
          "login": "dillon-zheng",
          "commits": 107,
          "avatar_url": "https://avatars.githubusercontent.com/u/8055290?v=4"
        },
        {
          "type": "User",
          "login": "purelind",
          "commits": 7,
          "avatar_url": "https://avatars.githubusercontent.com/u/16618216?v=4"
        },
        {
          "type": "User",
          "login": "lybcodes",
          "commits": 7,
          "avatar_url": "https://avatars.githubusercontent.com/u/50281525?v=4"
        },
        {
          "type": "User",
          "login": "ti-chi-bot",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/71242396?v=4"
        },
        {
          "type": "User",
          "login": "timzxz",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/6071150?v=4"
        }
      ],
      "contributors_sampled": 6,
      "top_contributor_share": 0.673
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "charts-release.yaml",
        "ci-mac-builder-operator.yml",
        "ci-tibuild-v2.yaml",
        "ci.yaml",
        "release.yaml",
        "weekly-release.yaml"
      ],
      "has_docs_dir": false,
      "linter_configs": [
        ".golangci.yml",
        "eslint.config.mjs"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": true
    },
    "security_signals": {
      "lockfiles": [
        "go.sum",
        "package-lock.json",
        "uv.lock"
      ],
      "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": 3,
            "reason": "branch protection is not maximal on development and all release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 9,
            "reason": "29 out of 30 merged PRs checked by a CI test -- score normalized to 9",
            "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": 10,
            "reason": "all changesets reviewed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 3 contributing companies or organizations -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 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 0 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 2,
            "reason": "dependency not pinned by hash detected -- score normalized to 2",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 2,
            "reason": "SAST tool is not run on all commits -- score normalized to 2",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 7,
            "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": 0,
            "reason": "405 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "0a4fa748fa14c8abec5ca89e765807205fa6dd17",
        "ran_at": "2026-07-25T12:51:20Z",
        "aggregate_score": 6.1,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-24T00:40:31Z",
      "oldest_open_prs": [
        {
          "number": 51,
          "created_at": "2023-12-09T16:19:03Z",
          "last_comment_at": "2024-12-12T11:48:42Z",
          "last_comment_author": "ti-chi-bot"
        },
        {
          "number": 257,
          "created_at": "2025-04-08T13:18:45Z",
          "last_comment_at": "2025-04-08T13:19:13Z",
          "last_comment_author": "ti-chi-bot"
        },
        {
          "number": 307,
          "created_at": "2025-08-29T03:50:58Z",
          "last_comment_at": "2026-06-25T13:18:15Z",
          "last_comment_author": "ti-chi-bot"
        },
        {
          "number": 311,
          "created_at": "2025-08-31T09:33:34Z",
          "last_comment_at": "2026-06-21T01:11:38Z",
          "last_comment_author": "renovate"
        },
        {
          "number": 322,
          "created_at": "2025-09-09T12:10:32Z",
          "last_comment_at": "2025-09-09T12:10:39Z",
          "last_comment_author": "ti-chi-bot"
        },
        {
          "number": 347,
          "created_at": "2025-12-02T04:13:41Z",
          "last_comment_at": "2025-12-02T04:24:50Z",
          "last_comment_author": "ti-chi-bot"
        },
        {
          "number": 360,
          "created_at": "2025-12-04T02:46:15Z",
          "last_comment_at": "2025-12-04T02:46:18Z",
          "last_comment_author": "ti-chi-bot"
        },
        {
          "number": 361,
          "created_at": "2025-12-04T02:46:21Z",
          "last_comment_at": "2025-12-04T02:46:26Z",
          "last_comment_author": "ti-chi-bot"
        },
        {
          "number": 362,
          "created_at": "2025-12-04T02:46:25Z",
          "last_comment_at": "2025-12-04T02:46:28Z",
          "last_comment_author": "ti-chi-bot"
        },
        {
          "number": 363,
          "created_at": "2025-12-04T02:46:27Z",
          "last_comment_at": "2025-12-04T02:46:31Z",
          "last_comment_author": "ti-chi-bot"
        },
        {
          "number": 364,
          "created_at": "2025-12-04T02:46:27Z",
          "last_comment_at": "2025-12-04T02:46:31Z",
          "last_comment_author": "ti-chi-bot"
        },
        {
          "number": 396,
          "created_at": "2026-03-30T20:21:51Z",
          "last_comment_at": "2026-03-30T20:21:55Z",
          "last_comment_author": "ti-chi-bot"
        },
        {
          "number": 407,
          "created_at": "2026-04-13T04:09:59Z",
          "last_comment_at": "2026-04-13T04:19:39Z",
          "last_comment_author": "copilot-swe-agent"
        },
        {
          "number": 546,
          "created_at": "2026-07-02T09:57:58Z",
          "last_comment_at": "2026-07-02T09:58:03Z",
          "last_comment_author": "ti-chi-bot"
        },
        {
          "number": 547,
          "created_at": "2026-07-02T09:58:03Z",
          "last_comment_at": "2026-07-02T09:58:08Z",
          "last_comment_author": "ti-chi-bot"
        },
        {
          "number": 548,
          "created_at": "2026-07-02T10:14:47Z",
          "last_comment_at": "2026-07-02T10:14:52Z",
          "last_comment_author": "ti-chi-bot"
        },
        {
          "number": 549,
          "created_at": "2026-07-02T10:14:55Z",
          "last_comment_at": "2026-07-02T10:14:59Z",
          "last_comment_author": "ti-chi-bot"
        },
        {
          "number": 552,
          "created_at": "2026-07-02T12:48:40Z",
          "last_comment_at": "2026-07-02T12:48:45Z",
          "last_comment_author": "ti-chi-bot"
        },
        {
          "number": 555,
          "created_at": "2026-07-03T09:12:27Z",
          "last_comment_at": "2026-07-03T09:12:32Z",
          "last_comment_author": "ti-chi-bot"
        },
        {
          "number": 568,
          "created_at": "2026-07-12T17:03:59Z",
          "last_comment_at": "2026-07-12T17:04:03Z",
          "last_comment_author": "ti-chi-bot"
        }
      ],
      "last_merged_pr_at": "2026-07-24T00:35:20Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 7,
          "created_at": "2023-10-31T08:57:29Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 145,
          "created_at": "2024-06-27T04:42:26Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 279,
          "created_at": "2025-05-09T03:16:52Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 406,
          "created_at": "2026-04-13T04:08:55Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 472,
          "created_at": "2026-05-29T11:33:35Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/PingCAP-QE/ee-apps",
    "host": "github.com",
    "name": "ee-apps",
    "owner": "PingCAP-QE"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 66,
      "inputs": {
        "security": 61,
        "vitality": 94,
        "community": 27,
        "governance": 67,
        "engineering": 75
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 94,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "excellent",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "commits_last_year": 242,
              "human_commit_share": 0.99,
              "days_since_last_push": 0,
              "active_weeks_last_year": 37
            },
            "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": "37/52 weeks with commits",
                "points": 25.6,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 37
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "242 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 242
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "releases_count": 51,
              "latest_release_tag": "v2026.7.19",
              "releases_from_tags": false,
              "days_since_latest_release": 6,
              "mean_days_between_releases": 7
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "51 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 51
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 6 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~7 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 7
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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": 1,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 1 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 1
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "critical",
        "name": "Community & Adoption",
        "value": 27,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 6,
            "inputs": {
              "forks": 3,
              "stars": 1,
              "watchers": 5,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "1 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "3 forks",
                "points": 2.5,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "5 watchers",
                "points": 3.3,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 67,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 34,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 6,
              "top_contributor_share": 0.673
            },
            "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 67% of commits",
                "points": 7.4,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 67
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "6 contributors",
                "points": 8.1,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 6
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 3 contributing companies or organizations -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 83,
            "inputs": {
              "merged_prs": 494,
              "open_issues": 5,
              "closed_issues": 12,
              "issue_closed_ratio": 0.706,
              "closed_unmerged_prs": 47
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "71% of issues closed",
                "points": 33,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 71
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "494/541 decided PRs merged",
                "points": 34.9,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 494,
                      "decided": 541
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "all changesets reviewed",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 63,
            "inputs": {
              "followers": 22,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "PingCAP-QE",
              "public_repos": 44,
              "account_age_days": 2109
            },
            "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": "22 followers of PingCAP-QE",
                "points": 9.8,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 22,
                      "login": "PingCAP-QE"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "44 public repos, account ~5 yr old",
                "points": 23.6,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 44
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 5
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/PingCAP-QE/ee-apps"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 9
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on go",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "go"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 9 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 9
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "48 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 48
                    }
                  }
                ],
                "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": 75,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "excellent",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": true
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "6 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 6
                    }
                  }
                ],
                "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, eslint.config.mjs",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml, eslint.config.mjs"
                    }
                  }
                ],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 9.6,
                "status": "met",
                "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": "29 out of 30 merged PRs checked by a CI test -- score normalized to 9",
                "points": 18,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 61,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "moderate",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 61,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "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": "branch protection is not maximal on development and all release branches",
                "points": 2.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "29 out of 30 merged PRs checked by a CI test -- score normalized to 9",
                "points": 2.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": "all changesets reviewed",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 3 contributing companies or organizations -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "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 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 2",
                "points": 1,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 2",
                "points": 1,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 5.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "405 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "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": 6
            },
            "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": "excellent",
        "name": "AI Readiness",
        "value": 86,
        "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.99,
              "agent_instruction_files": [
                "AGENTS.md"
              ],
              "agent_instruction_max_bytes": 4963
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.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": "98 of 99 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 98,
                      "sampled": 99
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "excellent",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum",
                "package-lock.json",
                "uv.lock"
              ],
              "has_dockerfile": true,
              "typed_language": false,
              "bootstrap_files": [
                "ci-dashboard/Makefile",
                "mac-builder-operator/Makefile",
                "tibuild/Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "mcp-servers/knowledge-base-mcp/src/vector_search/tidb_vector_ui/tsconfig.json"
              ],
              "agent_commit_share": 0.07,
              "toolchain_manifests": [
                "change-insight/go.mod",
                "chatops-lark/go.mod",
                "cloudevents-server/go.mod",
                "dl/go.mod",
                "experiments/tibuild-v2/go.mod",
                "mac-builder-operator/go.mod",
                "publisher/go.mod",
                "tibuild/go.mod"
              ],
              "dependency_bot_commit_share": 0.01
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "ci-dashboard/Makefile, mac-builder-operator/Makefile, tibuild/Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "ci-dashboard/Makefile, mac-builder-operator/Makefile, tibuild/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, eslint.config.mjs",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml, eslint.config.mjs"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "mcp-servers/knowledge-base-mcp/src/vector_search/tidb_vector_ui/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "mcp-servers/knowledge-base-mcp/src/vector_search/tidb_vector_ui/tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Dockerfile, lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile, lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "7 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 7,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "1 of the last 100 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 1,
                      "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 2",
                "points": 2,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "good",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 81,
            "inputs": {
              "primary_language": "Python",
              "largest_source_bytes": 275732,
              "source_files_sampled": 661,
              "oversized_source_files": 15
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Python with type-check config (mcp-servers/knowledge-base-mcp/src/vector_search/tidb_vector_ui/tsconfig.json)",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "typecheck_config_language",
                    "params": {
                      "files": "mcp-servers/knowledge-base-mcp/src/vector_search/tidb_vector_ui/tsconfig.json",
                      "language": "Python"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "15/661 source files over 60KB",
                "points": 53.8,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 661,
                      "oversized": 15
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "good",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 80,
            "inputs": {
              "example_dirs": [
                "samples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": [
                "dl/gen/http/openapi.json",
                "dl/gen/http/openapi.yaml",
                "experiments/tibuild-v2/internal/service/gen/http/openapi.json",
                "experiments/tibuild-v2/internal/service/gen/http/openapi.yaml",
                "publisher/internal/service/gen/http/openapi.json",
                "publisher/internal/service/gen/http/openapi.yaml",
                "tibuild/docs/swagger.json",
                "tibuild/docs/swagger.yaml"
              ]
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": "dl/gen/http/openapi.json, dl/gen/http/openapi.yaml, experiments/tibuild-v2/internal/service/gen/http/openapi.json, experiments/tibuild-v2/internal/service/gen/http/openapi.yaml, publisher/internal/service/gen/http/openapi.json, publisher/internal/service/gen/http/openapi.yaml, tibuild/docs/swagger.json, tibuild/docs/swagger.yaml",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "dl/gen/http/openapi.json, dl/gen/http/openapi.yaml, experiments/tibuild-v2/internal/service/gen/http/openapi.json, experiments/tibuild-v2/internal/service/gen/http/openapi.yaml, publisher/internal/service/gen/http/openapi.json, publisher/internal/service/gen/http/openapi.yaml, tibuild/docs/swagger.json, tibuild/docs/swagger.yaml"
                    }
                  }
                ],
                "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": "samples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "samples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "pypi package 'roster' points at a different repository (https://github.com/tombulled/roster); excluded from ecosystem scoring",
    "Could not fetch pypi package 'ci-dashboard' from its registry",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-25T12:51:43.410719Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/p/PingCAP-QE/ee-apps.svg",
  "full_name": "PingCAP-QE/ee-apps",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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