chore(release): v0.3.3 #45

Merged
quartermaster merged 2 commits from release-prep/v0.3.3 into main 2026-06-24 23:14:04 +02:00

Added

  • scripts/lib: fragment-kind vs change-type lint (warning-only) — closes #35

Fixed

  • lint: opt-out marker must be on own line + rename fragment .added → .internal — Surveyor 4710 pre-cut catch

Internal

  • scripts/lib/fragments.sh: new lint_fragment_kind + lint_fragments functions that flag suspicious kind-vs-body-content mismatches per the consumer-facing-surface test (docs/conventions.md). Two heuristics: (A) minor-bumping kind (added/changed/...) + docs-only body → warn "should this be .internal.md?"; (B) patch-bumping kind + new-capability body → warn "should this be .added.md?". Warning-only; never fails the cut. Author opt-out per fragment via <!-- lint-fragment-kind: ok --> body marker. Wired into release-prep.sh at bump-determination time. Same observability-not-author-discipline family as the #29 install-deps probe + the #16 empty-version ::error:: guard. See #35.

  • .forgejo/workflows/_debug-event-payload.yml (consumer-side, temporary): diagnostic workflow firing on pull_request.closed events that logs the full github.event JSON + individual field evaluations (head.ref, head.label, merged, startsWith() test). Surfaces the data needed to root-cause #41 — why the consumer-side release-draft.yml line 28 expression evaluates to empty. This workflow will be REMOVED once #41's right-layer fix lands (tracked on the issue). Disposition (A) per Surveyor e455 framing: probe first, don't fix on hypothesis.

### Added - **scripts/lib**: fragment-kind vs change-type lint (warning-only) — closes #35 ### Fixed - **lint**: opt-out marker must be on own line + rename fragment .added → .internal — Surveyor 4710 pre-cut catch ### Internal - **`scripts/lib/fragments.sh`**: new `lint_fragment_kind` + `lint_fragments` functions that flag suspicious kind-vs-body-content mismatches per the consumer-facing-surface test ([`docs/conventions.md`](docs/conventions.md#choosing-internal-vs-consumer-facing-the-consumer-facing-surface-test)). Two heuristics: (A) minor-bumping kind (`added`/`changed`/...) + docs-only body → warn "should this be `.internal.md`?"; (B) patch-bumping kind + new-capability body → warn "should this be `.added.md`?". Warning-only; never fails the cut. Author opt-out per fragment via `<!-- lint-fragment-kind: ok -->` body marker. Wired into `release-prep.sh` at bump-determination time. Same observability-not-author-discipline family as the [#29](https://git.frankenbit.de/frankenbit/release-toolkit/issues/29) install-deps probe + the [#16](https://git.frankenbit.de/frankenbit/release-toolkit/issues/16) empty-version `::error::` guard. See [#35](https://git.frankenbit.de/frankenbit/release-toolkit/issues/35). - **`.forgejo/workflows/_debug-event-payload.yml`** (consumer-side, temporary): diagnostic workflow firing on `pull_request.closed` events that logs the full `github.event` JSON + individual field evaluations (`head.ref`, `head.label`, `merged`, `startsWith()` test). Surfaces the data needed to root-cause [#41](https://git.frankenbit.de/frankenbit/release-toolkit/issues/41) — why the consumer-side `release-draft.yml` line 28 expression evaluates to empty. This workflow will be REMOVED once #41's right-layer fix lands (tracked on the issue). Disposition (A) per Surveyor e455 framing: probe first, don't fix on hypothesis.
Generated by release-toolkit release-prep.sh.

Tracker: frankenbit/release-toolkit#1
docs(CHANGELOG): clean up v0.3.3 section — drop mis-categorized commit-subject bullets + framing intro
Some checks failed
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 4s
manifest-check / check (pull_request) Successful in 0s
debug-event-payload / dump github.event JSON (pull_request) Successful in 1s
release-draft / create Forgejo draft release (pull_request) Failing after 4s
release-draft / draft (pull_request) Failing after 0s
b75ac359a8
## Symptom

Auto-cut emitted:
- ### Added: "**scripts/lib**: fragment-kind vs change-type lint" (from PR #43 first commit's `feat(scripts/lib):` subject)
- ### Fixed: "**lint**: opt-out marker must be on own line + ..." (from PR #43 second commit's `fix(lint):` subject)
- ### Internal: 2 fragments (correct)

Per the consumer-facing-surface test refined in v0.3.2 (Surveyor 2c9d):
the discriminator is whether RELEASE OUTPUT changes, not whether any
behavior is observable. The lint (warning-only) doesn't change release
output. So the `feat:` subject was wrong — should have been `chore:`.

Same meta-recursion pattern as PR #6 (v0.2.1) + PR #32 (v0.3.1 fragment
kind): ship the chore-vs-feat discipline, immediately violate it on
own subject/kind. Caught on auto-cut bump-escalation (v0.4.0 attempted
before bump_override=patch recovery).

## Cleanup

- **Drop ### Added section** (the bullet is a duplicate of the
  long-form fragment in ### Internal, AND the commit type was wrong)
- **Drop ### Fixed section** (the bullet describes a pre-merge lint
  design fix — not a consumer-observable fix; same internal class)
- **Fix the `_debug-event-payload.yml` filename in the probe fragment**
  to `debug-event-payload.yml` (the rename commit caught my own
  no-underscore convention slip at-commit-time — but the fragment
  body was written before the rename + still referenced the old name)
- **Add 2-paragraph framing intro** naming the sprint scope + the
  bump-decision rationale (consumer-facing-surface test refined in
  v0.3.2 applied here)

Net: v0.3.3 ships as a patch with 2 ### Internal entries (the lint
+ the temporary probe), substantively-internal as intended.

## What the auto-cut would have shown without manual fold

- v0.4.0 (minor) due to `feat:` commit subject (without bump_override)
- ### Added: lint commit-subject-bullet (mis-categorized)
- ### Fixed: lint design-fix commit-subject-bullet (mis-categorized)
- ### Internal: both long-form fragments

What the operator + Surveyor see now: v0.3.3 (patch), ### Internal-only,
framing-narrative makes the bump-decision auditable.

Tracker: v0.3.3 cut cleanup; follows the same shape as v0.3.0/v0.3.1/v0.3.2 manual folds.
Sign in to join this conversation.
No description provided.