From 7a8a12e56f6496b691b0ee668a3b012b76571060 Mon Sep 17 00:00:00 2001 From: Andrei Hasna Date: Sat, 8 Aug 2026 02:10:35 +0300 Subject: [PATCH] chore(release): prepare instructions 0.4.24 Carries 0fcb0542 (#72): the session renderer refuses, at plan time, to write a managed output the reader would later refuse. 0.4.23 raised the read bound and left the write unbounded, so the contract held by headroom rather than a check. Diff is package.json 0.4.23 -> 0.4.24 plus a CHANGELOG entry. No logic. Agent: Silvanus --- CHANGELOG.md | 42 ++++++++++++++++++++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fdfebe8..e76a54e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,47 @@ # Changelog +## 0.4.24 + +Publishes `0fcb0542` (#72): the renderer now REFUSES to write a managed output +the reader would later refuse, instead of relying on headroom. + +0.4.23 raised the read bound on managed outputs to +`SESSION_MANAGED_OUTPUT_MAX_BYTES` (8 MiB) and left the WRITE unbounded, so the +two sides agreed only by luck of corpus size. `planSessionRender` now rejects +any managed output past that bound and warns past half of it. + +The refusal is at PLAN time, deliberately. `planSessionRender` writes nothing, +so a refusal has no side effects: the previous home survives intact and merely +stale, and `session plan` / `session apply --dry-run` predict the failure rather +than discovering it mid-write. Refusing inside `apply` would land partway +through per-file atomic replacements and leave the home part-new, part-old with +a manifest describing neither. Truncation was rejected because a silently +shortened instruction home looks complete to every agent that reads it while +missing directives. + +The manifest is checked alongside the provider entrypoints, because both are +allowlisted at the same raised bound and both grow with the same corpus; a +render that guarded only the entrypoint would move the identical wedge onto the +manifest. + +The path match handles the codewith base mismatch: `SESSION_MANAGED_OUTPUT_PATHS` +is workspace-relative and a render plan's path is target-home-relative, which +for codewith differ by one segment. A direct comparison would guard claude and +codex and silently miss codewith. + +Measured against the live corpus at release time: 44 sources render to 298,164 +bytes, 28.1x under the bound, largest single source 26,564 bytes — so no single +addition can cross from silent to refused, and the headroom warning is +guaranteed to fire on many renders before the refusal ever can. + +Also corrects a false comment claiming `SESSION_MANAGED_OUTPUT_PATHS` is every +path in `projectContextSessionGuardPaths()`. It is deliberately narrower: the +project-context manifest, cache and fragment stay at `FOREIGN_INPUT_MAX_BYTES`. + +Known residual, tracked as `OPE15-00068`: a home that is ALREADY oversized stays +unrecoverable through this tool, because planning reads it before it can decide +to replace it. This release prevents the wedge; it does not cure one. + ## 0.4.23 Publishes `340aecac` (#69): the renderer no longer writes a managed instruction diff --git a/package.json b/package.json index 3015b86..d867d0b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@hasna/instructions", - "version": "0.4.23", + "version": "0.4.24", "description": "AI coding agent instruction & configuration manager \u2014 store, version, apply, and share all your AI coding configs. CLI + MCP + HTTP API (instructions-serve) + generated SDK + Dashboard.", "type": "module", "main": "dist/index.js",