Repository navigation
feat(forge): emit an EBTE-style Tool-Call Claims section (template 4) - #282
Merged
Merged
Conversation
trustabl forge now tells the coding agent to give every tool a typed claim argument (ToolInvocationExplanation) and to wire a mediation step that checks it against server-held facts before the call has any effect: deny on conflict, review on unknown, most restrictive wins, and the claim never grants authority. Placement is emitted per selected SDK. TemplateVersion 3 -> 4, so forge check reports existing skills outdated.
The OpenAI Agents SDK runs a tool input guardrail before the tool with the call's arguments, as its own examples/basic/tool_guardrails.py (in the corpus) shows, so it is the mediation point to name. Wording only; no template bump.
The LangChain block offered a graph node before the tool node as a mediation point. The Analyzer cannot see a check there, so a tool written that way gets LC-029 (claim nothing checks). The block now names only a shared decorator stacked under @tool, which the Analyzer reads as a wrapped claim. The mediation step and the checklist said the step removes `claim` before the tool body runs. The OpenAI tool input guardrail can only allow or reject, so it cannot do that. They now say the step reads the claim before any effect, removes it when it runs in a wrapper that can change the arguments, and that nothing after the step acts on it. Wording only, still unreleased template 4; no template bump.
Require the claim on every tool with an effect, not on every tool. A tool that only reads data the application already holds, for the current user, may skip it, and the tool registry marks which tools need one. Tools the application does not define keep the existing controls only. This matches the Analyzer, whose no-claim rule fires only on side-effecting tools. Keep a missing or malformed claim as a deny, and add an unknown schema_version. This differs from the paper, which sends schema failures to review: here a review would loop, since approving it re-runs the same failing checks. The other open questions are settled without code changes. The field set stays minimal, the OpenAI guardrail placement is confirmed, the Guard port waits for templates 2-4, and docs/forge.md stays out. Wording only, still unreleased template 4; no template bump.
sairenchristianbuerano
approved these changes
Oct 28, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
trustabl forgenow emits a## Tool-Call Claimssection in the generated SKILL.md, after the apply loop. It tells the coding agent to:claimargument (an EBTEToolInvocationExplanation). A tool that only reads data the application already holds, for the current user, may skip it, and the tool registry marks which tools need one;schema_version, is a deny;Placement is emitted for each detected SDK (
internal/forge/claimtext/sdk/). Every placement is one the Analyzer can see as a mediator, for example a tool input guardrail on OpenAI Agents or a shared decorator under@toolon LangChain, so a tool built from the skill doesn't trip the claims rules in #276 / #281.TemplateVersiongoes from 3 to 4, sotrustabl forge checkreports skills generated by template 3 as outdated.Notes for review
### Added. Whichever merges second needs a one-hunk fix (keep both bullets).Test plan
go build ./...,go vet ./...,go test ./...(27 packages ok), rebased onmainat f0bebfatestdata/forge/*/expected/updated for the new section and template version