` โ the MAIN change in one line.
```text
v1.2.4: Unified single-root CMake build
v1.2.7: LSQ and MLE solver benchmarks
v0.1.2: Fixed mixed-integer arithmetic and refactored GCD
v1.1.3: Vector-indexed Tp memoization caches
```
**A reader knows what the release is about before scrolling.** ๐ฏ
---
### The Style Guide: Emoji Categories ๐จ
Notes are organized by **impact**, not by commit order:
.font-sm[
| Category | Emoji | Example |
|---|---|---|
| Build System | ๐๏ธ | unified root CMakeLists |
| Fixes | ๐ | C4702 suppression |
| Performance | โก | nanobench migration |
| Refactoring | โป๏ธ | removed rapidcheck |
| Tests | ๐งช | test_installed consumer |
| Documentation | ๐ | build instructions |
| Maintenance | ๐ง | CI workflow switch |
| Dependencies | ๐ฆ | py2cpp v1.6.3 โ v1.6.4 |
]
**Only the categories present in the diff appear.** ๐
---
### The Style Guide: Narrative Bullets โ๏ธ
**Don't echo commit subjects โ describe the change:**
```text
โ fix: tell CPM fmt is handled to prevent duplicate target conflicts
โ
Only set SPDLOG_FMT_EXTERNAL when fmt is a system package, and tell
CPM fmt is already handled to prevent duplicate target conflicts
```
End with the changelog link:
```text
**Full Changelog**: https://github.com/luk036/lds-cpp/compare/v1.2.3...v1.2.4
```
**Concrete names, real effects, one click to the whole diff.** ๐
---
### Before vs After: lds-cpp v1.2.4 ๐ฌ
**Before** โ 18 flat bullets:
```text
- build: unify library, tests and standalone into a single root CMakeLists
- feat: add test_installed and standalone guards
- fix: suppress C4702 warning on MSVC
- chore: remove rapidcheck
- perf: add find_package fallback for fmt and spdlog
...
```
**After** โ one theme, four sections:
```text
## v1.2.4 โ Unified single-root CMake build
### ๐๏ธ Build System
- Unify library, tests, standalone and documentation into a single
root CMakeLists.txt; remove the subproject builds and cmake/ helpers
### ๐ Fixes
- Only set SPDLOG_FMT_EXTERNAL when fmt is a system package...
**Full Changelog**: https://github.com/luk036/lds-cpp/compare/v1.2.3...v1.2.4
```
**Same facts, real readability.** โจ
---
class: nord-light, middle, center
## โก The Execution
---
### Parallel Orchestration: 8 Agents ๐ค
23 projects โ **8 background agents**, 2โ3 repos each:
.mermaid[
graph TD
Orchestrator["Orchestrator\n (this session) "] --> A1["Agent A ๐ฏ\n ckpttn + corr-solver + csd "]
Orchestrator --> A2["Agent B ๐ฏ\n digraphx + digraphx-fast + ecgen "]
Orchestrator --> A3["Agent C ๐ฏ\n ellalgo + fractions + fractions-simple "]
Orchestrator --> A4["Agent D ๐ฏ\n ginger + lds-gen + lmi-solver "]
Orchestrator --> A5["Agent E ๐ฏ\n multiplierless + mywheel + netlistx "]
Orchestrator --> A6["Agent F ๐ฏ\n netoptim + netoptim-fast + physdes "]
Orchestrator --> A7["Agent G ๐ฏ\n projgeom + py2cpp + rat-trig "]
Orchestrator --> A8["Agent H ๐ฏ\n sphere-n + xnetwork "]
style Orchestrator fill:#e3f2fd,stroke:#1565c0,color:#2e3440,stroke-width:3px
style A1 fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px
style A2 fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px
style A3 fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px
style A4 fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px
style A5 fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px
style A6 fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px
style A7 fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px
style A8 fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px
]
**Each agent: 6โ10 minutes, all edits verified with `gh release view`.** โก
---
### The 24 Projects (1/2) ๐ฆ
.font-sm[
| # | Project | New Theme |
|:--:|---|---|
| 1 | lds-cpp | Unified single-root CMake build |
| 2 | ckpttn-cpp | Unified single-root CMake build |
| 3 | corr-solver-cpp | LSQ and MLE solver benchmarks |
| 4 | csd-cpp | Unified single-root CMake build |
| 5 | digraphx-cpp | Unified single-root CMake build |
| 6 | digraphx-fast | Unified single-root CMake build |
| 7 | ecgen-cpp | CMake build with nanobench benchmarks |
| 8 | ellalgo-cpp | Single-root build with nanobench benchmarks |
| 9 | fractions-cpp | Unified single-root CMake build |
| 10 | fractions-simple | Fixed mixed-integer arithmetic & GCD refactor |
| 11 | ginger-cpp | Single-root build, nanobench, lds-cpp dep |
| 12 | lds-gen-cpp | Unified build with system fmt/spdlog fallbacks |
]
---
### The 24 Projects (2/2) ๐ฆ
.font-sm[
| # | Project | New Theme |
|:--:|---|---|
| 13 | lmi-solver-cpp | README, Doxygen docs, installed-package verification |
| 14 | multiplierless-cpp | Unified single-root CMake build |
| 15 | mywheel-cpp | Unified single-root CMake build |
| 16 | netlistx-cpp | Unified single-root CMake build |
| 17 | netoptim-cpp | Unified single-root CMake build |
| 18 | netoptim-fast | Unified single-root CMake build |
| 19 | physdes-cpp | Single-root build with nanobench benchmarks |
| 20 | projgeom-cpp | Prefer system-installed fmt/spdlog/doctest |
| 21 | py2cpp | Unified single-root CMake build |
| 22 | rat-trig-cpp | Prefer system-installed fmt/doctest |
| 23 | sphere-n-cpp | Vector-indexed Tp memoization caches |
| 24 | xnetwork-cpp | Unified single-root CMake build |
]
---
### Themes That Emerged ๐
.mermaid[
graph TD
subgraph Themes["Themes across 24 releases"]
A["๐๏ธ Unified single-root CMake build\n 13 repos "]
B["โก nanobench benchmarks\n 4 repos "]
C["๐ System-first dependencies\n 3 repos "]
D["๐ฏ Project-specific work\n corr-solver / fractions-simple / \n lmi-solver / sphere-n "]
end
style Themes fill:#e8f5e9,stroke:#2e7d32,stroke-width:3px
style A fill:#e3f2fd,stroke:#1565c0,color:#2e3440,stroke-width:3px
style B fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px
style C fill:#fff3e0,stroke:#e65100,stroke-width:3px
style D fill:#f3e5f5,stroke:#7b1fa2,color:#2e3440,stroke-width:3px
]
**The same August batch shared one big wave โ the CMake unification.** ๐๏ธ
---
### Case Study: corr-solver-cpp ๐ฏ
**Title**: `v1.2.7: LSQ and MLE solver benchmarks`
.mermaid[
graph LR
A["New benchmark\n CorrSolverBenchmark "] --> B["LSQ solver\n least squares "]
A --> C["MLE solver\n maximum likelihood "]
A --> D["+312 lines\n benchmark/source/main.cpp "]
B --> E["โ Correctness\n verification first "]
C --> E
style A fill:#e3f2fd,stroke:#1565c0,color:#2e3440,stroke-width:3px
style B fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px
style C fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px
style E fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px
]
Also hardened `test_installed` to `find_package` deps and bumped EllAlgo โ v1.6.9. ๐ฆ
---
### Case Study: fractions-simple ๐งฎ
**Title**: `v0.1.2: Fixed mixed-integer arithmetic and refactored GCD`
.mermaid[
graph LR
A["const_abs + const_gcd\n iterative, buggy "] --> B["gcd_recur overloads\n int / long / unsigned "]
B --> C["operator+=(T) / -=(T)\n cross-reduction bug fixed "]
C --> D["โ Mixed-int tests\n int8_t + int64_t "]
style A fill:#ffcdd2,stroke:#c62828,stroke-width:3px
style B fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px
style C fill:#fff3e0,stroke:#e65100,stroke-width:3px
style D fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px
]
A **tiny header-only repo** โ but the bugfix deserved its own narrative. ๐ฏ
---
### Case Study: sphere-n-cpp ๐
**Title**: `v1.1.3: Vector-indexed Tp memoization caches`
.mermaid[
graph LR
A["unordered_map cache\n hash per access "] --> B["std::vector indexed\n by n/2 "]
B --> C["O(1) dense lookup\n Tp odd/even dims "]
C --> D["+ coverage tests\n Sphere3 / SphereN / CylindN "]
style A fill:#ffcdd2,stroke:#c62828,stroke-width:3px
style B fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px
style C fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px
style D fill:#fff3e0,stroke:#e65100,stroke-width:3px
]
**The headline was performance โ not the docs or the cleanup.** ๐๏ธ
---
### Case Study: lmi-solver-cpp ๐
**Title**: `v1.0.2: README, Doxygen docs, and installed-package verification`
- **First-ever README** โ the library had none! ๐
- **Doxygen documentation** + GitHub Pages workflow ๐
- **`test_installed`** consumer verifying `find_package(LmiSolver)` ๐งช
- **EllAlgo** dependency v1.6.8 โ v1.6.9 ๐ฆ
> Different repos need different themes โ the workflow **adapts**. ๐จ
---
### Verification: Spot-Checked โ
After all agents finished, a full sweep confirmed **every** title:
```text
ckpttn-cpp v1.2.4: Unified single-root CMake build
corr-solver-cpp v1.2.7: LSQ and MLE solver benchmarks
fractions-simple v0.1.2: Fixed mixed-integer arithmetic and refactored GCD
sphere-n-cpp v1.1.3: Vector-indexed Tp memoization caches
xnetwork-cpp v1.7.7: Unified single-root CMake build
... (all 24 verified via gh release list)
```
.mermaid[
graph LR
A["24 releases edited"] --> B["24 titles verified"]
B --> C["โ
All present"]
style A fill:#e3f2fd,stroke:#1565c0,color:#2e3440,stroke-width:3px
style B fill:#fff3e0,stroke:#e65100,stroke-width:3px
style C fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px
]
**Every release edited, every edit verified.** โ
---
class: nord-light, middle, center
## ๐ Key Takeaways
---
### Lessons Learned ๐
.mermaid[
graph LR
A["1. Diff, not subjects\n read the real changes "] --> B["2. One theme title\n vX.Y.Z: <what> "]
B --> C["3. Emoji categories\n grouped by impact "]
C --> D["4. Full Changelog link\n always "]
D --> E["5. Verify after edit\n gh release view "]
E --> F["6. Delegate in parallel\n 8 agents ร 3 repos "]
style A fill:#e3f2fd,stroke:#1565c0,stroke-width:3px
style B fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px
style C fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px
style D fill:#fff3e0,stroke:#e65100,stroke-width:3px
style E fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px
style F fill:#f3e5f5,stroke:#7b1fa2,color:#2e3440,stroke-width:3px
]
**Release notes are a contract with your users โ make them readable.** ๐ฅ
---
### Before vs After ๐
| Metric | Before | After |
|---|---|---|
| **Title** | tag name `v1.2.4` | `v1.2.4: Unified single-root CMake build` |
| **Structure** | flat commit bullets | emoji-categorized sections |
| **Theme** | none | one per release |
| **Changelog link** | rarely | always present |
| **Repos fixed** | 0 | **24** |
| **Verified** | โ | `gh release view` โ
|
**Same facts, real readability, consistent across 24 repos.** ๐
---
### One Simple Command ๐
The whole session reduces to one command:
```bash
gh release edit v1.2.4 \
--title "v1.2.4: Unified single-root CMake build" \
--notes-file notes.md
```
Plus the discipline before it:
```text
git log PREV..LATEST โ what changed
git diff PREV LATEST โ how much, where
write notes.md โ theme + categories + link
gh release edit ... โ apply
gh release view ... โ verify
```
**24 releases, one repeatable recipe.** โก
---
class: nord-light, middle, center
## ๐ค The AI-Coding Impact
---
### Why AI Coding Cares About Release Notes ๐ง
AI agents are **context-constrained** and **pattern-driven**:
.mermaid[
graph LR
A["Agent receives task\n 'rewrite the release notes' "] --> B{"What does it read?"}
B -- "Commit dump ๐" --> C["18 subjects, no theme\n guessing what mattered "]
B -- "Diff ๐ฌ" --> D["Real changes\n title + sections emerge "]
C --> E["Low-quality, generic notes"]
D --> F["Accurate, specific notes"]
style A fill:#e3f2fd,stroke:#1565c0,stroke-width:3px
style B fill:#fff3e0,stroke:#e65100,stroke-width:3px
style C fill:#ffcdd2,stroke:#c62828,stroke-width:3px
style D fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px
style E fill:#ffcdd2,stroke:#c62828,stroke-width:3px
style F fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px
]
**The diff is the source of truth โ commit subjects are just noise.** ๐ฏ
---
### 7 Ways This Pattern Helps AI Agents ๐ค
| # | Impact | Why it matters |
|:--:|---|---|
| 1 | **Reusable skill** ๐ | same workflow in every repo |
| 2 | **Context-efficient** ๐ง | read the diff, not the whole repo |
| 3 | **Deterministic verdict** โ
| `gh release view` = green/red |
| 4 | **Theme clarity** ๐ฏ | title answers "what changed?" |
| 5 | **Parallelizable** โก | independent repos โ 8 agents |
| 6 | **Full traceability** ๐ | changelog compare link |
| 7 | **Consistent voice** ๐จ | emoji categories everywhere |
---
### The Meta-Point ๐ก
**AI coding thrives on predictable, verifiable workflows.** This session:
- **Analyzed** the real diff โ not commit messages ๐ง
- **Synthesized** a theme + categorized narrative โ๏ธ
- **Applied** with one standard command ๐ ๏ธ
- **Verified** every result before reporting ๐ก
> The boring, repetitive part (24 ร the same recipe) is exactly what agents do best. ๐
**Honest caveat**: the quality ceiling is set by the diff analysis โ a lazy agent that skips `git diff` produces generic notes. The workflow **enforces** the analysis step. โ ๏ธ
---
count: false
class: nord-dark, middle, center
# ๐ Thank You
## Questions? ๐ค
### **"GitHub Release Notes Rewriting โ From Commit Dumps to Narrative Notes"**
Slides: `luk036.github.io/proglang/gh-release-remark.html`
---
count: false
class: nord-dark, middle, center
# ๐ That's All Folks!
## **24 Releases, 8 Agents, One Workflow** ๐
### `git diff` โ `gh release edit` โ `gh release view`. Done. โ