Conversation
The native execute seam projects a handler Result onto the declared output contract and then validates it, so a graph handler that omits one required field answers OUTPUT_SCHEMA_VIOLATION for a call that already read or mutated the graph. get_node_details shipped without nodeId and create_reroute_node without nodeGuid - both are published in dev today, but nothing keeps them published. The gate works over the BlueprintGraph handler sources and the canonical registry: every required output field of every graph sub-action must be published by some handler (collected recursively, so the Context/ handlers are in scope), the self-contained readbacks must publish theirs inside the function that claims the sub-action, and the projected payloads are checked against their own output schema so the omission fails with the message the gateway actually reports. Co-Authored-By: Daedalus <daedalus@agents.flopbut.local> Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Advanced Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
Closing: the defect class this gate memorializes no longer exists on Rebased the branch onto
Both consolidated records declare I checked whether a quieter failure replaced it, since the projection keeps only declared properties. It did not: So both defects this branch guards were resolved by a change in the shape of the contract, not by the two one-line fixes it cites. A gate pinned to per-action capability ids cannot survive that, and rewriting it against the consolidated records would be a different test with a different premise. Worth recording for later: the class is not extinct registry-wide. 34 records still declare a required output field beyond |
Context
Upstream reproduced
get_node_detailsfailing on the native transport withOUTPUT_SCHEMA_VIOLATION: Missing required parameter 'nodeId'while A/B-testing theposX/posYfix (ChiR24#592, merged 2026-08-10), together withcreate_reroute_nodereturning an error receipt for a Knot it had just created.
Both are already fixed in
dev— no code fix is proposed here:get_node_detailsomitsnodeIdResult->SetStringField(TEXT("nodeId"), NodeId)in...BlueprintGraphHandlersDetails.cppf4b9c66a, 2026-08-23create_reroute_nodeomitsnodeGuidResult->SetStringField(TEXT("nodeGuid"), ...)in...BlueprintGraphHandlersNodeMutations.cpp52b5b8d2, 2026-09-04What is missing is a gate. The same mistake landed twice in the same domain within a
month, and both times it broke the readback step of an operation that had actually
succeeded: the native execute seam projects a handler
Resultonto the declared outputcontract and then validates it, so one unpublished required field turns a working call
into an error and the caller never receives the handle.
What this adds
tests/unit/plugin/blueprint_graph_output_field_contracts.test.ts, driven by thegenerated canonical registry plus the
GraphSubActionslist in the domain registration(no hand-maintained list of actions):
some BlueprintGraph handler. Sources are collected recursively, because
list_node_typeslives inContext/and a root-only scan does not see it.Result(
get_node_details,create_reroute_node,get_graph_details,get_pin_details,list_node_types), the field must be published inside the function that claims thesub-action.
create_nodeis deliberately excluded and documented: it finalizes throughthe shared node-creation path, so only tier 1 can speak for it.
schema via the existing
schema-subsetmirror, so the omission fails asmissing-requiredwith the exact message the gateway reports(
Missing required parameter 'nodeId').Verification
Host is Raspberry Pi / ARM64 with no Unreal Engine, so nothing here was editor-verified —
but this change is tests-only and the gate itself was proven to bite:
npx vitest run tests/unit/plugin/blueprint_graph_output_field_contracts.test.ts→ 8 passed.test fails and names both:
npx eslinton the new file → clean.npx vitest run tests/unit/plugin/→ 809 passed, 3 failed. All 3 failures pre-exist onclean
dev(80430fd2) — verified by re-running them with this file removed:source_structure_contracts(McpAutomationBridgeHelpersProjectPaths.his 267 pure linesvs the 250 gate) and the two
native_discovery_*parity contracts undergateway/.🤖 Generated with Claude Code