[quality] Gate proposal: values.schema.json rules and chart template arms without a helm-unittest assertion
メンテナーはふだん 1 日以内に返信
まだ誰も着手していません。
評価
- 難易度
- 3/5
- 見積もり時間
- 1〜2日
- 初心者へのやさしさ
- 15/100
- issue の種類
- 機能追加
- 明瞭さ
- 説明が足りない
- 活発さ
- 活発
- 技術スタック
- json, typescript, yaml
- 領域
- testing-qa
調査の方向性
Start with the schema rules in charts/prow-github-app/values.schema.json and the existing failedTemplate cases in charts/prow-github-app/tests/schema_test.yaml and topology_test.yaml. The issue asks for a governance decision first: whether to add a merge-blocking vitest gate (tests/chartAssertions.test.ts) and the eleven missing negative cases. Do not start coding until a maintainer accepts or declines it. If accepted, done means each listed rule has a helm-unittest case that fails when the rule is loosened.
索引モデルが issue の本文から書いたものです。
説明
Finding
This proposal was first filed on 2026-11-03 and folded by the hive into #665 (comment <!-- hive-finding-folded -->); #665 was then closed by #666, so the decision it asked for was never taken. Re-filed standalone so it can be accepted or declined.
It is the fourth finding in the same class on charts/prow-github-app — a template arm or schema rule that helm unittest renders but never asserts — so per the quality lane's rules it is a gate proposal, not a fourth tests-only PR.
Prior instances (each landed as a held tests-only PR after being verified by mutating the template and watching the new assertion fail):
-
#665 → #666 (merged): checksum roll annotations, six placement pass-throughs, the release-contains fullname arm.
-
#668 → #669 (merged):
nameOverrideselector agreement, service/pdb/cronjob/prow pass-throughs, common labels. -
#671 (merged): both install-notes arms, the Redis note, the cronjob-disabled arm, probe paths, securityContext, resources.
-
This instance —
charts/prow-github-app/values.schema.jsonrejection rules. Atmain@91a1669(all three PRs above merged) the chart suites contain sevenfailedTemplatecases: six intests/schema_test.yaml(≥2 replicas without Redis, a non-rediss?://URL, empty credentials, an empty schedule, one misspelled key at the root, one undercronjob) and one intests/topology_test.yaml(terminationGracePeriodSeconds: 15). No case asserts that the schema rejects any of:image.pullPolicyoutside["Always","IfNotPresent","Never"]prow.mergeMethodoutside["","merge","squash","rebase"]github.apiUrlnot matching^$|^https?://redis.existingSecretKey: ""(minLength: 1)cronjob.activeDeadlineSeconds: 0(minimum: 1)cronjob.successfulJobsHistoryLimit/failedJobsHistoryLimit: -1(minimum: 0)service.port: 0(minimum: 1)replicaCount: 0(minimum: 1)image.repository: ""(minLength: 1)github.existingSecret: ""with no app credentials (anyOf[0]minLength: 1)- a misspelled key under any of
image,github,prow,redis,service,ingress,serviceAccount,podDisruptionBudget(additionalProperties: false— only the root andcronjobblocks have a negative)
Every existing mention of those paths in
tests/*_test.yamlsets a valid value (grep -n 'pullPolicy\|mergeMethod\|apiUrl\|existingSecretKey\|activeDeadlineSeconds\|JobsHistoryLimit\|service.port\|image.repository' charts/prow-github-app/tests/*_test.yaml), so loosening or deleting any rule above passeshelm unittest,ct lintand both kind installs.
Evidence method (reproducible at main@91a1669): list every enum|pattern|minimum|minLength|additionalProperties|required in values.schema.json; for each, grep tests/*_test.yaml for a case that set:s the path to an invalid value and asserts failedTemplate (grep -c failedTemplate charts/prow-github-app/tests/*.yaml → 6 + 1). Unit evidence: helm unittest charts/prow-github-app. End-to-end evidence: the chart CI job installs charts/prow-github-app/ci/single-values.yaml and the HA values file into kind — both are schema-valid, so no install exercises a rejection rule. The schema rejections are reached by neither suite; the schema is the chart's only input validation.
The missing gate
Nothing in CI measures what the chart suite exercises, which is why this class recurs one file at a time. The repository already gates repository text with vitest contract tests (__tests__/workflows.test.ts "action.yml mirrors the inputs src/ reads"; __tests__/coverageIgnoreHints.test.ts), so the cheapest gate with the same shape is:
__tests__/chartAssertions.test.ts (runs under npm test in the existing build-test job — no workflow change, no new dependency; js-yaml is already in package.json):
- parse
charts/prow-github-app/values.schema.json; collect every property path carryingenum,pattern,minimum,minLength,requiredoradditionalProperties: false(including underif/then/anyOf); - scan
charts/prow-github-app/templates/*for.Values.<path>inside{{ if | with | range | else if }}; - parse
charts/prow-github-app/tests/*_test.yamland collectset:keys, split by whether the case assertsfailedTemplate; - fail with the list of paths that (a) gate a template arm but appear in no test, or (b) carry a schema constraint but appear in no
failedTemplatecase. A path-shaped allowlist constant in the test records any deliberate exception with its reason.
Scope stays additive: no config keys change, no chart files move, the chart job is untouched.
Decision requested
- Accept — the quality lane opens one held PR adding
__tests__/chartAssertions.test.tsplus the eleven schema negatives above intests/schema_test.yaml, so the gate is green on arrival. - Decline — the lane resumes individual chart findings (next: the eleven schema negatives as a plain held PR, no gate).
Risk: governance — this adds a merge-blocking rule on chart contributions, which is the maintainers' call, not the lane's.
Priority
- Impact: medium (a loosened schema rule reaches users as a mis-rendered install with no error)
- Effort: low (one vitest file, ~11 helm-unittest cases)
Filed by quality agent (hold-gated mode)
🐝 Hive Agent: quality | Instance: hosted-available-lke648397-260827-5q9t | SHA: 91a1669
— hive: agent=quality backend=copilot model=claude-fable-5.1 copilot=1.0.88
- 主要言語
- TypeScript
- スター
- 132
- フォーク
- 24
- 平均マージ
- 1日 6時間
- マージ済み PR(30日)
- 232
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
cncf/prow-github-actions のほかの issue
-
[quality] chart: CronJob name exceeds the 52-character API limit for release names of 32+ characters; no test pins resource-name length対応中かも @mrbobbytables が今日担当しました。 オープンagent/quality kind/cleanup stage/040-covered-by-pr testing
難易度 3/5 半日 初心者へのやさしさ 50/100
cncf/prow-github-actions#667 ·
メンテナーはふだん 1 日以内に返信
-
hive/advisory kind/cleanup
難易度 5/5 1週間以上 初心者へのやさしさ 15/100
cncf/prow-github-actions#170 · コメント 9 件 ·
メンテナーはふだん 1 日以内に返信
cncf/prow-github-actions の issue をすべて見る
似ている issue
-
ci-cd desktop size:low telemetry-improvement telemetry-round-1
難易度 2/5 1〜3時間 初心者へのやさしさ 66/100
vfarcic/dot-agent-deck#2079 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
メンテナーはふだん 1 日以内に返信
-
難易度 1/5 1時間未満 初心者へのやさしさ 83/100
メンテナーはふだん 1 日以内に返信
-
status:in-linear
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
メンテナーはふだん 1 日以内に返信
-
🔊 a11y
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
betagouv/mon-entreprise#4726 ·
メンテナーはふだん 9 日以内に返信