Keep a Changelog (MADSci)
The MADSci changelog lives at docs/CHANGELOG.md and follows Keep a Changelog 1.1.0 with Semantic Versioning. This skill captures the format rules and the MADSci-specific conventions layered on top.
Core Principles
- Changelogs are for humans, not machines. Describe user-visible impact, not commit history.
- Every released version gets a section. Skipping versions destroys trust in the document.
- Group by change type, not by PR. Readers want "what changed", not "what shipped together".
- Reverse chronological. Newest version on top;
[Unreleased]always above the latest release. - Dates in ISO 8601 (
YYYY-MM-DD). Never localized formats.
Change Categories
Use only these six headings, in this order when present:
| Category | Use for |
|----------|---------|
| ### Added | New features, endpoints, CLI commands, settings, templates, public APIs |
| ### Changed | Behavior changes to existing features (non-breaking and breaking) |
| ### Deprecated | APIs/features still working but scheduled for removal |
| ### Removed | Deleted features, endpoints, settings, classes, files |
| ### Fixed | Bug fixes |
| ### Security | Vulnerability patches |
Omit empty categories. Do not invent new ones (Refactored, Internal, Infrastructure, etc.) — pick the closest of the six.
Section Structure
## [Unreleased]
### Added
- **`SilaNodeClient`**: New client for SiLA2 servers over gRPC. Supports observable/unobservable commands and binary responses.
### Changed
- **BREAKING**: `DocumentDBBackupSettings` env prefix changed from `MONGODB_` to `DOCUMENT_DB_`.
### Removed
- **`madsci new workcell` subcommand**: Generated an orphaned YAML format with no Pydantic model.
## [0.8.0] - 2026-03-31
### Added
...
Conventions used in this repo
- Lead with the symbol or feature in backticks/bold:
- **`SilaNodeClient`**: ...— readers scan the bold prefix to find what they care about. - Mark breaking changes inline with
**BREAKING**:at the start of the bullet, even inside### Changedor### Removed. - Optional sub-headings (
####) group large feature buckets within a category — see the[0.8.0]"Node Location Template System" pattern. Use sparingly: only when one release ships several distinct, named workstreams. - Cross-reference issues, PRs, and OpenSpec changes with relative links:
[openspec/changes/...](../openspec/changes/...). CHANGELOG paths are relative todocs/, not repo root. - Explain the why for removals and deprecations. A removal entry should answer "what should I use instead?".
Workflow: Adding an Entry
When you ship a user-visible change on a feature branch:
- Open
docs/CHANGELOG.md. - Find the
## [Unreleased]section at the top. - Add your bullet under the correct category, creating the
### Added/### Changed/etc. subheading if it doesn't exist yet. - Order categories Added → Changed → Deprecated → Removed → Fixed → Security.
- Write the bullet from the user's perspective — what they can now do, what changed for them, what they need to migrate.
One PR ≠ one bullet. Split a multi-feature PR into multiple bullets across categories. Combine trivially related bullets (e.g., five new CLI subcommands of one command group can be one bullet listing the subcommands).
Workflow: Cutting a Release
When promoting [Unreleased] to a versioned release:
- Decide the version per SemVer: breaking changes → major; new features → minor; fixes only → patch. (MADSci is pre-1.0, so minor bumps may include breaking changes — call them out explicitly.)
- Replace
## [Unreleased]with## [X.Y.Z] - YYYY-MM-DDusing today's date. - Insert a fresh empty
## [Unreleased]section above it. - Within the new release section, prune anything that turned out to be reverted, internal-only, or duplicated.
- Verify
pyproject.tomlversions and the CHANGELOG version match.
What NOT to Include
- Merge commits, "merging with unstable", pre-commit autofixes, lint-only churn
- Internal refactors with no observable behavior change (unless they unblock something users will notice)
- Test-only changes
- Dependency bumps, unless they change supported versions or fix a CVE (use
### Security) - Generated files (
docs/Configuration.md, OpenAPI specs) - Future plans, TODOs, "coming soon" notes — the changelog records what shipped
Anti-Patterns
- Commit-log dump: pasting
git log --onelineoutput. Translate commits into user impact. - Vague entries: "Various fixes and improvements", "Refactored auth". Name the surface that changed.
- Tense drift: pick past tense ("Added X", "Removed Y") and stay consistent within a release.
- Burying breaking changes in
### Fixedor unmarked under### Changed. Always prefix with**BREAKING**:. - Editing released sections to add forgotten entries. Add them to
[Unreleased]with a note (Backport from 0.8.0:) instead — released sections are immutable history. - Omitting the Unreleased section after cutting a release. Always leave a fresh empty one.
Quick Audit
Before merging a PR, ask:
- Did this PR change anything a user would notice (API, CLI, config, behavior, defaults)?
- If yes: is there a CHANGELOG entry under
[Unreleased]in the right category? - If breaking: is it marked
**BREAKING**:? - If a removal/deprecation: does the entry tell the user what to use instead?
For the broader release-time audit (docs, examples, templates, skills), see the madsci-release-audit skill — it invokes this skill for the CHANGELOG portion.