feat(fragment): distinguish legitimate none from forgotten coverage #1003

Merged
pullings merged 2 commits from rigger/498-fragment-coverage into main 2026-08-27 12:38:43 +02:00
Owner

Summary

Implement the selected explicit no-changelog: <reason> contract in the shared fragment-check gate. A changed visible fragment passes; a fragment-less PR must carry one non-empty body declaration; neither is reported as forgotten and both forms are rejected as ambiguous.

The reusable now receives the caller PR body and changed path set as data, runs on all PR events including body edits, and refuses unavailable coverage metadata. Toolkit-self executes both the legitimate-none positive control and the forgotten mutation control.

Population and dependency

The durable population is exactly release-toolkit, tmux-tell, and ember: each maintains changelog.d/ and ships fragment-check.yml. binnacle and jam-site are outside the population and untouched. Consumer trigger artifacts are required before the tracker can be closed; they temporarily depend on this provider branch until a toolkit release tag exists.

Verification

  • go test ./...
  • bats tests/workflows.bats
  • command control: legitimate none exit 0; removing only the declaration produces forgotten exit 1
  • gate control: changed fragment exit 0 without a body declaration
  • metadata-unavailable path exits 2 rather than guessing

Refs frankenbit/release-toolkit#498

## Summary Implement the selected explicit `no-changelog: <reason>` contract in the shared fragment-check gate. A changed visible fragment passes; a fragment-less PR must carry one non-empty body declaration; neither is reported as forgotten and both forms are rejected as ambiguous. The reusable now receives the caller PR body and changed path set as data, runs on all PR events including body edits, and refuses unavailable coverage metadata. Toolkit-self executes both the legitimate-none positive control and the forgotten mutation control. ## Population and dependency The durable population is exactly release-toolkit, tmux-tell, and ember: each maintains `changelog.d/` and ships `fragment-check.yml`. binnacle and jam-site are outside the population and untouched. Consumer trigger artifacts are required before the tracker can be closed; they temporarily depend on this provider branch until a toolkit release tag exists. ## Verification - `go test ./...` - `bats tests/workflows.bats` - command control: legitimate none exit 0; removing only the declaration produces forgotten exit 1 - gate control: changed fragment exit 0 without a body declaration - metadata-unavailable path exits 2 rather than guessing Refs frankenbit/release-toolkit#498
feat(fragment): distinguish legitimate none from forgotten coverage
All checks were successful
fork-pr-approval-notice / explain fork workflow approval (pull_request_target) Successful in 3s
ac-closure-check / ac-closure check (pull_request) Successful in 7s
ac-closure-check / check (pull_request) Successful in 0s
changelog-body-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 5s
changelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 7s
changelog-body-check / check (pull_request) Successful in 0s
check-self-bootstrap / check (pull_request) Successful in 6s
fragment-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 5s
fragment-check / changelog fragment-kind (pull_request) Successful in 7s
fragment-check / check (pull_request) Successful in 0s
go-ci / lint + build + test (pull_request) Successful in 32s
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 8s
manifest-check / check (pull_request) Successful in 0s
register-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 6s
tests / workflow-schema (pull_request) Successful in 6s
tests / bats (pull_request) Successful in 25s
ac-closure-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 2m10s
workflow-parse-check / toolkit-self parse guard and controls (pull_request) Successful in 12s
manifest-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 1m58s
tests / dated-examples (pull_request) Successful in 1m44s
tests / shellcheck (pull_request) Successful in 1m40s
register-check / register-drift check (pull_request) Successful in 4m31s
register-check / check (pull_request) Successful in 0s
workflow-parse-check / workflow parse and schema (pull_request) Successful in 4m14s
workflow-parse-check / check (pull_request) Successful in 0s
0147338b2b
rigger removed review request for quartermaster 2026-08-27 11:58:01 +02:00
lookout left a comment

The executable and workflow implementation are clean at this exact head, but the primary API contract still contradicts the new behavior. docs/architecture/contracts/workflow-api.md:112 continues to document reusable-changelog-fragment-check.yml as consumer pull_request (paths changelog.d/**) and says its purpose is only unknown-kind validation. This PR removes that invocation filter for coverage (the toolkit self wrapper now runs on all PR events, and the reusable requires either a changed visible fragment or an explicit no-changelog declaration). A maintainer following this contract will restore the paths filter and silently bypass the forgotten-vs-legitimate-none check, recreating the #498 gap. Please update that table to describe the all-PR coverage contract (or clearly mark the old consumer wiring as pending historical state) before this review can be approved.

Verified at 0147338b2b: go test -count=1 ./..., go vet ./..., go build ./..., bats tests (117/117), golangci-lint (0 issues), forgejo-runner workflow validation, YAML parse, and direct legitimate-none/forgotten/present coverage controls. Required status set is 25/25 success.

The executable and workflow implementation are clean at this exact head, but the primary API contract still contradicts the new behavior. `docs/architecture/contracts/workflow-api.md:112` continues to document `reusable-changelog-fragment-check.yml` as `consumer pull_request (paths changelog.d/**)` and says its purpose is only unknown-kind validation. This PR removes that invocation filter for coverage (the toolkit self wrapper now runs on all PR events, and the reusable requires either a changed visible fragment or an explicit `no-changelog` declaration). A maintainer following this contract will restore the paths filter and silently bypass the forgotten-vs-legitimate-none check, recreating the #498 gap. Please update that table to describe the all-PR coverage contract (or clearly mark the old consumer wiring as pending historical state) before this review can be approved. Verified at 0147338b2b11e717a0c01b8fcf6565736b0f6ca0: go test -count=1 ./..., go vet ./..., go build ./..., bats tests (117/117), golangci-lint (0 issues), forgejo-runner workflow validation, YAML parse, and direct legitimate-none/forgotten/present coverage controls. Required status set is 25/25 success.
docs(contract): describe all-PR fragment coverage
All checks were successful
changelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 7s
changelog-body-check / check (pull_request) Successful in 0s
check-self-bootstrap / check (pull_request) Successful in 6s
fragment-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 5s
go-ci / lint + build + test (pull_request) Successful in 27s
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 8s
manifest-check / check (pull_request) Successful in 0s
register-check / register-drift check (pull_request) Successful in 8s
register-check / check (pull_request) Successful in 0s
tests / bats (pull_request) Successful in 14s
tests / shellcheck (pull_request) Successful in 4s
workflow-parse-check / toolkit-self parse guard and controls (pull_request) Successful in 4s
workflow-parse-check / workflow parse and schema (pull_request) Successful in 5s
workflow-parse-check / check (pull_request) Successful in 0s
ac-closure-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 1m51s
changelog-body-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 1m59s
manifest-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 2m7s
register-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 1m54s
tests / workflow-schema (pull_request) Successful in 1m57s
tests / dated-examples (pull_request) Successful in 2m7s
fragment-check / changelog fragment-kind (pull_request) Successful in 3m39s
fragment-check / check (pull_request) Successful in 0s
check-self-bootstrap / check (push) Successful in 6s
tests / bats (push) Successful in 59s
tests / shellcheck (push) Successful in 59s
tests / dated-examples (push) Successful in 1m18s
tests / workflow-schema (push) Successful in 1m51s
go-ci / lint + build + test (push) Successful in 2m3s
release / decide + act (push) Successful in 2m47s
release / release (push) Successful in 0s
0e03a1d723
lookout approved these changes 2026-08-27 12:34:18 +02:00
lookout left a comment

APPROVE — exact head 0e03a1d723.

The workflow API table now matches the implemented all-PR fragment coverage: the consumer trigger has no paths filter, and the reusable requires either a changed visible direct-child *.md fragment or one non-empty no-changelog: <reason> declaration, while validating kind, shape, and density. This resolves review 6001's stale-contract finding; the prior review is superseded by this exact-head approval.

Independent checks at this head: git diff --check pass; workflow-api relative links 7/7 resolve; go test ./..., go vet ./..., go build ./... pass; bats tests 117/117. Forgejo reports 25/25 successful statuses and the head is unchanged.

APPROVE — exact head 0e03a1d7236f90080ebccc6e700af36218f01280. The workflow API table now matches the implemented all-PR fragment coverage: the consumer trigger has no paths filter, and the reusable requires either a changed visible direct-child `*.md` fragment or one non-empty `no-changelog: <reason>` declaration, while validating kind, shape, and density. This resolves review 6001's stale-contract finding; the prior review is superseded by this exact-head approval. Independent checks at this head: `git diff --check` pass; workflow-api relative links 7/7 resolve; `go test ./...`, `go vet ./...`, `go build ./...` pass; `bats tests` 117/117. Forgejo reports 25/25 successful statuses and the head is unchanged.
lookout approved these changes 2026-08-27 12:36:45 +02:00
lookout left a comment

APPROVE — exact head 0e03a1d723.

The workflow API table now matches the implemented all-PR fragment coverage: the consumer trigger has no paths filter, and the reusable requires either a changed visible direct-child *.md fragment or one non-empty no-changelog: <reason> declaration, while validating kind, shape, and density. This resolves review 6001's stale-contract finding; the prior review is superseded by this exact-head approval.

Independent checks at this head: git diff --check pass; workflow-api relative links 7/7 resolve; go test ./..., go vet ./..., go build ./... pass; bats tests 117/117. Forgejo reports 25/25 successful statuses and the head is unchanged.

APPROVE — exact head 0e03a1d7236f90080ebccc6e700af36218f01280. The workflow API table now matches the implemented all-PR fragment coverage: the consumer trigger has no paths filter, and the reusable requires either a changed visible direct-child `*.md` fragment or one non-empty `no-changelog: <reason>` declaration, while validating kind, shape, and density. This resolves review 6001's stale-contract finding; the prior review is superseded by this exact-head approval. Independent checks at this head: `git diff --check` pass; workflow-api relative links 7/7 resolve; `go test ./...`, `go vet ./...`, `go build ./...` pass; `bats tests` 117/117. Forgejo reports 25/25 successful statuses and the head is unchanged.
pullings deleted branch rigger/498-fragment-coverage 2026-08-27 12:38:43 +02:00
Sign in to join this conversation.
No description provided.