From 372ef8ff40991644ec2654c61328f31779f4ad21 Mon Sep 17 00:00:00 2001 From: t Date: Mon, 17 Aug 2026 23:35:36 -0600 Subject: Validation-pass fixes; DESIGN.md describes the shipped seam MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit jobs: a child whose wake pipe cannot be armed is refused up front instead of started into a state nothing can wake (the luv-less drain loop survives only for hosts without a loop); a closing child keeps its concurrency slot and its id's exclusivity until the pump actually exits, so teardown can no longer over-admit new children or let two turns share one session file. Resume-metadata reads honor the plain-error contract on a malformed store. workflow: the built-in schema subset validator is the only validator — the jsonschema probe made behavior depend on an undeclared rock (see rockspec: that dependency is deliberately rejected); dead exports and the unreachable half of the structured-output guard are gone, keeping the empty-arguments provider case. DESIGN.md's seam sections now describe the shipped division: binding-level async jobs and tool control, host-level resolve_model/ExtHost/turn events/ component handles, rock-level policy; protocol bodies run to completion on the loop thread and cannot yield, cancellation is scoped to the stream that opened it, and a child's compaction leaves protocol sessions alone. --- spec/test_run.lua | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'spec/test_run.lua') diff --git a/spec/test_run.lua b/spec/test_run.lua index 706faff..e4bb038 100644 --- a/spec/test_run.lua +++ b/spec/test_run.lua @@ -254,6 +254,30 @@ return { end) end }, + -- The binding reports a stored record it cannot decode by raising. A + -- malformed message is skipped, and nothing here raises out to the tool. + { "stored metadata that cannot be decoded is skipped, not raised", function() + with_host(function(handle, profiles) + local stored = stored_reviewer() + for _, message in ipairs(stored) do + if message.metadata then + message.metadata = nil + message.metadata_error = "message_metadata: invalid JSON" + end + end + handle.add_session("0198-child", stored) + handle.queue({ output = "second turn" }) + + local text = run.handle({ id = "0198-child", prompt = "carry on" }, profiles) + assert(not text:find("Error:", 1, true), "a malformed record is not a tool error:\n" .. text) + has(text, "second turn") + has(text, "agent: ?") -- an unreadable manifest names no agent + assert(handle.spawns[1].model == "anthropic:sonnet", + "an unreadable stored default falls back to the primary's model, got " .. + tostring(handle.spawns[1].model)) + end) + end }, + { "a resumed child takes its agent name from the manifest", function() with_host(function(handle, profiles) handle.add_session("0198-child", stored_reviewer()) -- cgit v1.3