8000 build(release): changelog fragments in changelog.d/ instead of one Unreleased section by adeelahmad · Pull Request #581 · adeelahmad/lense · GitHub
[go: up one dir, main page]

Skip to content

build(release): changelog fragments in changelog.d/ instead of one Unreleased section - #581

Merged
adeelahmad merged 2 commits into
mainfrom
claude/project-thread-200yii
Oct 18, 2026
Merged

adeelahmad merged 2 commits into
mainfrom
claude/project-thread-200yii

Conversation

@adeelahmad
Copy link
Copy Markdown
Owner

Requested by Adeel · project thread

Description

Before: a pull request that wanted more than its title in the changelog wrote a paragraph under ## Unreleased in CHANGELOG.md. Every such PR edited the same spot, so each conflicted with every other and had to merge main again after each merge to main.

After: the PR adds one Markdown file under changelog.d/ (named after its branch; changelog.d/README.md says how). The Release workflow folds the fragments into the new version's section, oldest commit first, after any Unreleased text, deletes them, and doesn't list a change with a fragment again by its title. Nothing changes for readers of CHANGELOG.md; ## Unreleased still works for the PRs in flight.

How: release.py cut reads changelog.d/*.md (ordered by the commit that added each, git log --diff-filter=A), joins them into the body and unlinks them so git commit -a records the deletions; changes_since counts a fragment as "documented". Tested by .github/scripts/test_release.py (a throwaway git repo: order, deletion, Unreleased first, a fragment alone is a release, README and dotfiles stay), run by a new pre-commit hook when the script changes. CONTRIBUTING, docs/contributing.md, the workflow header and AGENTS.md say to write a fragment.

Motivation and Context

Measured on main: 56 non-release commits touched CHANGELOG.md between 2026-10-16 and 2026-10-18. On 2026-10-18 one PR (#521) merged main six times in five hours because every merge touching CHANGELOG.md conflicted it again. With fragments, two PRs' changelog text never touches the same file.

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change; ! in the title)

Checklist:

  • The title is a Conventional Commit.
  • My code follows the code style of this project (make hooks checks it on commit).
  • I added or updated tests.
  • My change requires documentation updates, and I have updated docs/ accordingly.
  • Users need more than the title to understand it: n/a, a contributor-facing change; the title is enough.

Done questions (AGENTS.md)

  • Goal: delivers what the user wanted, merged on green CI (merging on green).
  • Agents: n/a, a repository convention; agents writing PRs follow AGENTS.md, updated here.
  • Zero setup: no new prerequisite, .env edit or manual step.
  • Fewest clicks and keystrokes: one file per PR instead of a conflict resolution per merge.
  • Configurable: n/a, no setting.
  • Light: n/a, nothing runs on an install.
  • Private and secure: n/a, no new surface.
  • Cost: n/a, no model calls.
  • User decides: n/a; existing ## Unreleased text still works.
  • Upgrades: n/a, no stored data.
  • Honest: docs claim only what the script does.
  • Tests, docs and generated files updated.
  • Open standards: Markdown fragments, as scriv and towncrier use; no new dependency.
  • Result reported with evidence in the loop thread; refine later: the in-flight PRs keep their Unreleased lines until they land, then that path can go.
  • Reuse: extends the existing release.py rather than adding a changelog tool.

Generated by Claude Code

…released section

Every feature PR wrote its paragraph under CHANGELOG.md's "## Unreleased", the same
spot, so each conflicted with every other: 56 PRs touched that section in the
three days to October 18, and one PR merged main six times in five hours without
catching up. A PR now adds one file under changelog.d/ instead. The release folds
the fragments, oldest commit first, into the new version's section after any
Unreleased text and deletes them; a change with a fragment isn't listed again by
its title. Tested by .github/scripts/test_release.py, run by pre-commit when the
script changes.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NY27LFMbLezbvQQQeHT19a
@adeelahmad adeelahmad self-assigned this Oct 18, 2026
@adeelahmad
adeelahmad merged commit f3b8611 into main Oct 18, 2026
9 checks passed
@adeelahmad
adeelahmad deleted the claude/project-thread-200yii branch October 18, 2026 09:40
adeelahmad pushed a commit that referenced this pull request Oct 18, 2026
The changelog paragraph moves to changelog.d/projects.md (#581).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015ZmJ29Kc4iXuyKqCRifAH5
adeelahmad pushed a commit that referenced this pull request Oct 18, 2026
….d fragment, and name them in the README

The release commit folds Unreleased into the version section and #581 moved new entries to changelog.d/, so the
entry becomes changelog.d/timeline-social.md. The README's built line lost its reactions and comments clause in an
earlier merge; it is back.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ln25ykE6uBDqx21WBU94SX
adeelahmad added a commit that referenced this pull request Oct 18, 2026
* feat(timeline): emoji reactions and comments on activities

The timeline becomes a feed everyone in a namespace talks on. An opened item has a React button with a palette and shows everyone's reactions as chips; its comments open as threads with Reply, where Enter sends. A closed line sums its items' reactions and says how many comments it has. A comment on an asset's arrival is a comment on the asset, so the same thread shows on its page.

Each reaction is a reaction.added activity (noisy, by the person, with the activity as its object) and each comment a comment.added with the activity as its target, following the activity's audience, so automations and agents can act on them. Agents react and comment over MCP (react_to_activity, activity_comments, comment_on_activity) and through POST /activities/{id}/react and /activities/{id}/comments.

Reactions are one event_reaction row per person and activity, as marks are; comments reuse the comment table with an activity field. No model call is involved.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ln25ykE6uBDqx21WBU94SX

* docs(readme): list the assistant's answers about Lens itself as built

Release 0.15.0 carries #400, so the requirements check failed on main
with it still under In progress; it moves to the built list with its
checks.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ln25ykE6uBDqx21WBU94SX

* fix(chat): show a new conversation's first answer when its first load raced the stream

The page moves to /chat/{id} as a new conversation's first answer
streams. On a slow device that first load of the conversation is still
in flight when the answer ends, and the query cache folds the refetch
asked for then into the load, which predates the answer: the page showed
"No answer was saved for this question" until reloaded (the phone
clicks survey's chat-ask journey in CI). After an answer, when the
conversation read back lacks it, it is read once more.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ln25ykE6uBDqx21WBU94SX

* Revert "fix(chat): show a new conversation's first answer when its first load raced the stream"

This reverts commit 7f260ec: #582 carries
the same fix for main (refetchFresh in every chat panel, and the answer
written on a thread of its own), so this PR stays one concern.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ln25ykE6uBDqx21WBU94SX

* docs(changelog): move the reactions and comments entry to a changelog.d fragment, and name them in the README

The release commit folds Unreleased into the version section and #581 moved new entries to changelog.d/, so the
entry becomes changelog.d/timeline-social.md. The README's built line lost its reactions and comments clause in an
earlier merge; it is back.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ln25ykE6uBDqx21WBU94SX

---------

Co-authored-by: Adeel Ahmad <noreply@anthropic.com>
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.

2 participants

0