Skip to content

FEAT-LOOP-2026-0249: changelog fragments so concurrent PRs stop conflicting - #3566

Merged
clabonte merged 25 commits into
mainfrom
feat/FEAT-LOOP-2026-0249-changelog-fragments
Nov 3, 2026
Merged

clabonte merged 25 commits into
mainfrom
feat/FEAT-LOOP-2026-0249-changelog-fragments

Conversation

@clabonte

@clabonte clabonte commented Nov 3, 2026

Copy link
Copy Markdown
Contributor

Summary

Two open PRs that each add a changelog entry no longer conflict when one merges, in any project that opts in, and every entry still reaches the released section. Closes #3563.

  • changelog.mode: single|fragments in .specfuse/layout.yml. Default single; those projects keep the same read and write path.
  • python3 -m specfuse.loop.changelog_fragments with add, collate and check.
  • One reader: close-k, specfuse lint --closing and the terminal auto-close guard all accept an entry in a fragment or in CHANGELOG.md. A malformed fragment does not count.
  • scripts/bump_version.py release() folds fragments before stamping, deletes them, and reports the deletions in its returned list.
  • New changelog-fragments verification gate; /fix-bug and close-discipline §3 now call the writer.
  • This repository opts in.

Review notes

  • Judge surfaces changed. The operator reviewed them at the terminal stop and acknowledged them: "guards not weakened, single-file behavior unchanged". changelog.py and changelog_fragments.py also joined the judge module list, so future edits to them trigger the same stop.
  • Added at the stop, outside any unit: dfbed42, so release() reports removed fragments. A caller staging its list would otherwise miss the deletions and fold them again next release.
  • Retrospective wording: it says the post-merge items were "filed at close as specfuse:post-merge". They were not: post_merge_issue defaults off, followups_recorded shows filed: 0, and the checklist lives in the archived roadmap section by design.

Verification

  • Oracle python3 -m unittest tests.test_changelog_fragments -v -b: 28 tests pass, no skips.
  • Driver broad run clean; judge agreed met.
  • CHANGELOG.md has no entry for this feature; the close passed on fragments alone.

Not verified by the loop:

  • GitHub's merge button with two real PRs (the oracle uses real git merge)
  • An adopter's own release script calling collate
  • A real adopter opting in across specfuse upgrade
  • CI running the new gate (this PR is the first run)

Pending learnings (needs promotion)

  • [FEAT-LOOP-2026-0249/T01] A unit that gives a function its first production caller must drop that function from the caller-check ratchet's BASELINE in the same unit. T01 made append_entry a real caller target, which shrank the baseline, and test_the_baseline_has_not_silently_shrunk went red. Its narrow tier did not select that repo-wide test, so T01 passed and the failure surfaced at T06's baseline probe, attributed to T06, as a preexisting_gate_failure halt that needed a human. Rule: when a unit wires up previously uncalled code, name the ratchet update in its acceptance and run tests.test_caller_check_ratchet in its verification; a green narrow tier does not cover repo-wide ratchets.

To promote: read each entry in LEARNINGS-pending.md, copy accepted ones into .specfuse/LEARNINGS.md, leave rejected ones with a note; planning never reads the pending file directly.

🤖 Generated with Claude Code

Test and others added 25 commits November 2, 2026 11:08
Every CHANGELOG.md writer appends at one insertion point, so two open
PRs conflict as soon as one merges, and a conflicted PR gets no CI run.
Draft an opt-in changelog.d/ flow: one gate, seven units plus the close.
Status stays planned; nothing is armed.

Refs #3563.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Feature: FEAT-LOOP-2026-0249/T02
Feature: FEAT-LOOP-2026-0249/T03
Feature: FEAT-LOOP-2026-0249/T04
Feature: FEAT-LOOP-2026-0249/T05
…2026-0249/T06 — awaiting_review

Feature: FEAT-LOOP-2026-0249
changelog_fragments now calls append_entry, so the ratchet reported a
stale BASELINE entry and halted gate 1 at T06's re-probe. Reopen the gate.

Refs #3563.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Feature: FEAT-LOOP-2026-0249/T06
Feature: FEAT-LOOP-2026-0249/T07
Feature: FEAT-LOOP-2026-0249
A caller staging release()'s returned list would miss the deletions, and
the next release would fold the same fragments again.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nblocked

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Feature: FEAT-LOOP-2026-0249
Feature: FEAT-LOOP-2026-0249/G1-CLOSE
Feature: FEAT-LOOP-2026-0249
…vent

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@clabonte
clabonte merged commit 2429889 into main Nov 3, 2026
7 checks passed
@clabonte
clabonte deleted the feat/FEAT-LOOP-2026-0249-changelog-fragments branch November 3, 2026 13:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Changelog fragments: stop concurrent PRs conflicting on CHANGELOG.md

1 participant