RELEASE_VALIDATION.md
RELEASE_VALIDATION.md
0.8.3 fixes two findings from the first 0.8.2 session with a web-search tools plugin (qwen3.8-27b, 14,848-token window), both diagnosed from the saved conversation file and the SDK 1.5.0 source.
<tool_call> XML in the chat — root cause in the SDK: act()
runs the final maxPredictionRounds round with tools disabled; the model,
still mid-task, wrote its tool call as plain text, which was shown and
never executed, then re-issued for real in the next pass. Every XML block
in the saved chat sits immediately before a pass boundary. Fix: passes end
by aborting act() after the last allowed round's messages (src/passCap.ts
createPassCap); no tool-less round is generated; the empty-reply
fallback is skipped on a capped pass.nextRoundFits + estimateMessageTokens end the pass at
the end of any round whose growth would push the next request past the
window minus the reply reserve (10% cushion on the estimate).tests/passCap.test.ts, tests/estimate.test.ts).
npm run check: typecheck, typecheck:tests, 353/353 tests in 21 files.lms dev --install, web-search plugin +
qwen3.8-27b): user confirmed the model now shows real search tool calls
with no <tool_call> text, and mid-session compaction runs cleanly with
no engine 400.0.8.2 is a one-fix release from a user report: with a web-search tools plugin loaded alongside this one, the search tool's "Searching..." status vanished from the chat as soon as compression was on.
0.8.1 is the release hardened by the first real dual-plugin run: both plugins in one LM Studio 0.4.15 chat (qwen3.8-27b at 16,384) driving an actual coding task through Plan-mode and Manual-mode approvals with forced and automatic compaction in between. Every fix in it comes from something that visibly broke in that chat and was verified from disk afterwards.
Run natively on Windows 11 (Node 22+, the project's own Vitest/Rollup binaries) — no cross-platform shim required.
npm run typecheck).npm run typecheck:tests).npm test, part of
). 306 before this release plus the two new contract tests.tests/agenticProtocol.test.ts builds its fixtures from the actual Agentic
Workspace producer code rather than from an idea of it. For this release the
envelopes were re-derived by reading the sibling plugin's source:
npm run bench — the live, model-backed recall benchmark was not re-run for
0.8.x; the committed 0.7.0 matrix under bench/results/ remains the record.0.8.3 fixes two findings from the first 0.8.2 session with a web-search tools plugin (qwen3.8-27b, 14,848-token window), both diagnosed from the saved conversation file and the SDK 1.5.0 source.
<tool_call> XML in the chat — root cause in the SDK: act()
runs the final maxPredictionRounds round with tools disabled; the model,
still mid-task, wrote its tool call as plain text, which was shown and
never executed, then re-issued for real in the next pass. Every XML block
in the saved chat sits immediately before a pass boundary. Fix: passes end
by aborting act() after the last allowed round's messages (src/passCap.ts
createPassCap); no tool-less round is generated; the empty-reply
fallback is skipped on a capped pass.nextRoundFits + estimateMessageTokens end the pass at
the end of any round whose growth would push the next request past the
window minus the reply reserve (10% cushion on the estimate).tests/passCap.test.ts, tests/estimate.test.ts).
npm run check: typecheck, typecheck:tests, 353/353 tests in 21 files.lms dev --install, web-search plugin +
qwen3.8-27b): user confirmed the model now shows real search tool calls
with no <tool_call> text, and mid-session compaction runs cleanly with
no engine 400.0.8.2 is a one-fix release from a user report: with a web-search tools plugin loaded alongside this one, the search tool's "Searching..." status vanished from the chat as soon as compression was on.
0.8.1 is the release hardened by the first real dual-plugin run: both plugins in one LM Studio 0.4.15 chat (qwen3.8-27b at 16,384) driving an actual coding task through Plan-mode and Manual-mode approvals with forced and automatic compaction in between. Every fix in it comes from something that visibly broke in that chat and was verified from disk afterwards.
Run natively on Windows 11 (Node 22+, the project's own Vitest/Rollup binaries) — no cross-platform shim required.
npm run typecheck).npm run typecheck:tests).npm test, part of
). 306 before this release plus the two new contract tests.tests/agenticProtocol.test.ts builds its fixtures from the actual Agentic
Workspace producer code rather than from an idea of it. For this release the
envelopes were re-derived by reading the sibling plugin's source:
npm run bench — the live, model-backed recall benchmark was not re-run for
0.8.x; the committed 0.7.0 matrix under bench/results/ remains the record.model.act() gives every tool a
SimpleToolCallContext whose status()/warn() only write to the plugin
logger; LM Studio's native loop renders a per-call widget through
ctl.createToolStatus. Our loop never created one, so another plugin's
progress text had nowhere to go. The activePredictionLoopHandlerWarning
the reporter saw is LM Studio's model-loader banner
(models:loader.info.activePredictionLoopHandlerWarning), shown whenever a
plugin owns the prediction loop; not an error.src/toolStatus.ts (runWithToolStatus)
mirrors status/warn into a per-call tool status and finishes it as
succeeded-with-timing or failed (thrown, or a capped "Tool execution failed"
result); status failures are swallowed so the tool call is never affected.
Wired in actWithUi. 7 new tests in tests/toolStatus.test.ts.lms dev): with the
web-search tools plugin loaded and compression on, the tool status shows in
the chat, results come back with links, no errors in the chat or logs.npm run check: typecheck, typecheck:tests, 340/340 tests in 20 files.workspace_plan was
proposed, /compress forced (19 messages → 2 chunks), /accept executed the
exact plan; later a Manual-mode staged approval (approval_mtah40ge, the
commit of two new files) survived /compress, the model named the id, the
operation, and its task item from the compacted context ("From memory, no
re-read" at a ~6,100-token prompt of an ~18,000-token chat), /accept
re-issued the exact workspace_edit commit (+14/−0), and the follow-up
npm test job exited 0. All of it verified from .agentic/ state and the
saved conversation, not from model prose.npm run checknpm run bench:static) — model-free
structural/determinism checks.workspace_inspect { action: "changes" } — built as src/tools/workspaceTool.ts
builds it, including the jobs array (CommandJobSummary records from
src/execution/processRunner.ts: job_* id, status, executable, optional
exit code, start time), the producer's real retention.facts lines, and its
omit list. Twenty jobs, the producer's default listing limit, which is also
this module's generic array cap: the test proves a full listing arrives field
for field with no entry traded for an omittedItems counter, on both the
plain shape and the shape where every bulky array around it is declared
omittable. Renaming the key drops the array entirely, so the preservation rule
is load-bearing and the test is not vacuous.src/policy/gateRuntime.ts stagedResult builds
them, with the web gate kind taken from src/tools/researchTool.ts
gateEgress (research network egress). Pinned on the normal path and on the
overflow path.qwen/qwen3.8-27b — 13/14 recall (matches the 2026-08-20 baseline; required 3 live fixes to get there: the truncation-headroom retry, the structural-digest fallback, and the compact rescue prompt — see CHANGELOG).deepseek-r1-distill-llama-8b — 9/14 recall.gemma-3-12b — 11/14 recall.meta/llama-3.2-3b — 13/14 recall (full prompt) vs 10/14 (compact prompt); this result is the basis for auto mode always using full.llama-3.2-8x3b-MoE — 14/14 recall (full prompt).qwen3-1.7b — 11/14 recall, sub-second chunks, /no_think honored.openai/gpt-oss-20b — 11/14 recall, no Harmony leaks.glm-4.7-flash — 9/14 recall.gemma-3-12b, google/gemma-4-26b, and mythomax-l2-13b all accept the system role on their LM Studio templates, so the no-system-role fold path stays dormant on these models — validated in the safe direction (the probe correctly declines to fold when folding isn't needed).model.act() gives every tool a
SimpleToolCallContext whose status()/warn() only write to the plugin
logger; LM Studio's native loop renders a per-call widget through
ctl.createToolStatus. Our loop never created one, so another plugin's
progress text had nowhere to go. The activePredictionLoopHandlerWarning
the reporter saw is LM Studio's model-loader banner
(models:loader.info.activePredictionLoopHandlerWarning), shown whenever a
plugin owns the prediction loop; not an error.src/toolStatus.ts (runWithToolStatus)
mirrors status/warn into a per-call tool status and finishes it as
succeeded-with-timing or failed (thrown, or a capped "Tool execution failed"
result); status failures are swallowed so the tool call is never affected.
Wired in actWithUi. 7 new tests in tests/toolStatus.test.ts.lms dev): with the
web-search tools plugin loaded and compression on, the tool status shows in
the chat, results come back with links, no errors in the chat or logs.npm run check: typecheck, typecheck:tests, 340/340 tests in 20 files.workspace_plan was
proposed, /compress forced (19 messages → 2 chunks), /accept executed the
exact plan; later a Manual-mode staged approval (approval_mtah40ge, the
commit of two new files) survived /compress, the model named the id, the
operation, and its task item from the compacted context ("From memory, no
re-read" at a ~6,100-token prompt of an ~18,000-token chat), /accept
re-issued the exact workspace_edit commit (+14/−0), and the follow-up
npm test job exited 0. All of it verified from .agentic/ state and the
saved conversation, not from model prose.npm run checknpm run bench:static) — model-free
structural/determinism checks.workspace_inspect { action: "changes" } — built as src/tools/workspaceTool.ts
builds it, including the jobs array (CommandJobSummary records from
src/execution/processRunner.ts: job_* id, status, executable, optional
exit code, start time), the producer's real retention.facts lines, and its
omit list. Twenty jobs, the producer's default listing limit, which is also
this module's generic array cap: the test proves a full listing arrives field
for field with no entry traded for an omittedItems counter, on both the
plain shape and the shape where every bulky array around it is declared
omittable. Renaming the key drops the array entirely, so the preservation rule
is load-bearing and the test is not vacuous.src/policy/gateRuntime.ts stagedResult builds
them, with the web gate kind taken from src/tools/researchTool.ts
gateEgress (research network egress). Pinned on the normal path and on the
overflow path.qwen/qwen3.8-27b — 13/14 recall (matches the 2026-08-20 baseline; required 3 live fixes to get there: the truncation-headroom retry, the structural-digest fallback, and the compact rescue prompt — see CHANGELOG).deepseek-r1-distill-llama-8b — 9/14 recall.gemma-3-12b — 11/14 recall.meta/llama-3.2-3b — 13/14 recall (full prompt) vs 10/14 (compact prompt); this result is the basis for auto mode always using full.llama-3.2-8x3b-MoE — 14/14 recall (full prompt).qwen3-1.7b — 11/14 recall, sub-second chunks, /no_think honored.openai/gpt-oss-20b — 11/14 recall, no Harmony leaks.glm-4.7-flash — 9/14 recall.gemma-3-12b, google/gemma-4-26b, and mythomax-l2-13b all accept the system role on their LM Studio templates, so the no-system-role fold path stays dormant on these models — validated in the safe direction (the probe correctly declines to fold when folding isn't needed).