diff --git a/CHANGELOG.md b/CHANGELOG.md index f25126f..cfa860f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,28 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.5.5] - 2026-05-05 + +### Added + +- Section-aware greedy line accumulator for hot session state rendering that fits whole lines instead of truncating mid-line. +- `accountHotSessionStateRender()` accounting function returning prompt text, omitted items, and char budget for v2 evidence extension. +- Exported types for render accounting diagnostics: `HotStateSection`, `HotStateOmissionReason`, `HotStateOmittedItem`, `HotSessionStateRenderAccounting`. +- 9 direct unit tests for hot session state rendering covering empty state, ranking, section caps, char budget, boundary conditions, header suppression, wrapper parity, and newline counting. +- Two-layer omission model: section caps first (`section_cap`), then char budget (`char_budget`), with clear per-item omission reasons. + +### Changed + +- Hot session state rendering no longer uses blunt `.slice(0, maxRenderedChars)` prompt truncation. +- Header-only sections are suppressed: a section is only rendered if at least one entry line fits the char budget. +- `renderHotSessionState()` is now a delegation wrapper to `accountHotSessionStateRender().prompt`, preserving backward compatibility. +- Fixed `docs/configuration.md` active-file ranking formula: was `count * action_weight * recency_decay` with weights 4/3/2/1, now correctly `ACTION_WEIGHT[action] + count * 3` with weights edit 50, write 45, grep 30, read 20, tie-break by `lastSeen` descending. +- Clarified `README.md` system prompt injection order: workspace memory and hot state index positions depend on whether workspace memory state is available. + +### Fixed + +- Hot session state prompt could be truncated mid-line under the old `.slice()` budget enforcement. + ## [1.5.4] - 2026-05-02 ### Changed diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 5ab7166..633f67a 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,5 +1,43 @@ # Release Notes +## 1.5.5 (2026-05-05) + +### Hot State Rendering Health + +This release replaces blunt prompt truncation with a section-aware greedy renderer that fits whole lines and suppresses empty sections, plus render accounting types for future diagnostics. + +> **Good rendering is selective too.** If a section doesn't fit, omit it — don't cut it in half. + +### What Changed + +- **Whole-line rendering**: the hot session state prompt no longer truncates mid-line with `.slice(0, maxRenderedChars)`. A greedy line accumulator fits complete lines and stops when the next line would exceed the 700-char budget. +- **Header-only sections suppressed**: a section heading is only rendered if at least one entry fits alongside it. No more orphaned `active_files:` headers with no content underneath. +- **Render accounting**: `accountHotSessionStateRender()` now returns `prompt`, `omitted[]`, and `maxRenderedChars` so future v2 diagnostics can surface which items fell out and why. +- **Two-layer omission model**: section caps (`section_cap`) trim per-type overflow first, then the char budget (`char_budget`) trims anything that doesn't fit. Each omitted item carries its reason and section. +- **Backward-compatible wrapper**: `renderHotSessionState()` delegates to the accounting function and returns just the prompt string, preserving existing plugin behavior. + +### Docs Fixes + +- **Active-file ranking formula corrected**: `docs/configuration.md` now matches the actual implementation — `ACTION_WEIGHT[action] + count * 3` with weights edit 50, write 45, grep 30, read 20, tie-break by `lastSeen` descending. The old docs claimed `count * action_weight * recency_decay` with weights 4/3/2/1. +- **Injection order clarified**: README now explains that workspace memory and hot state system-prompt positions depend on whether workspace memory state is available. + +### Not Included Yet + +- Evidence events for omitted items are deferred to v2, pending a `memory-diag` consumer to avoid unused storage litter. + +### Upgrade Notes + +- No configuration changes required. +- Existing workspace memory files remain compatible. +- Hot session state rendering behavior is intentionally different (cleaner output, no mid-line cuts), but the same information is presented when it fits within the budget. + +### Validation + +- `npm run typecheck` — `TYPECHECK_PASS` +- `npm test` — 356 tests passing, `TEST_PASS` + +--- + ## 1.5.4 (2026-05-02) ### Memory Diagnostics Surface Cleanup diff --git a/package.json b/package.json index fa24079..da94d70 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "opencode-working-memory", - "version": "1.5.4", + "version": "1.5.5", "description": "Three-layer memory architecture for OpenCode with workspace memory and hot session state", "type": "module", "main": "index.ts",