Skip to content

A hidden value belongs to the request, not the run - #34

Merged
jithinAB merged 1 commit into
masterfrom
pact-kernel/request-scoped-vault
Nov 14, 2026
Merged

jithinAB merged 1 commit into
masterfrom
pact-kernel/request-scoped-vault

Conversation

@jithinAB

Copy link
Copy Markdown
Contributor

gets-hidden-values: yes (docs/98 WP-11) put a card back only for an action of the agent whose own redaction hid it. Two gaps, found while bringing the field to Bud Meta Harness (its card PK-7, scenario "placeholder across delegation"):

  1. Delegation. A lead that hands the charge to a cashier hides the card one way ([removed]), because the lead uses no such action itself, so the cashier's action can never get the number back. A live run of a two-agent card desk on BMH showed exactly that.
  2. Unknown placeholders. A placeholder the run's vault does not hold (another request's, or one the model made up) was sent to the tool as literal text.

What changes

  • AgentSpec.team_gets_hidden: whether a member of the agent's team, at any depth, uses an action that gets hidden values. Such a lead keeps hidden values as placeholders.
  • run(vault=...): the request's vault rides the grant to every member, as board= does, declared in SUPPLIED_BY_THE_HOST; a run makes one when it, or its team, has such an action.
  • Vault.unknown: a call of such an action whose arguments carry a placeholder the request does not hold is not made; the model reads not done: ⟦card-number-7⟧ stands for no value this request holds — use only the placeholders this conversation showed you, exactly as written.
  • spec/schema.yaml help for gets-hidden-values, CHANGELOG, README counts.

Tests

adapters/python: uv run --extra all --extra test pytest tests/ — 3339 passed before the count and boundary-table updates, then the four affected files re-run green (20 passed). New: test_a_placeholder_the_request_does_not_hold_is_never_sent, test_a_member_restores_the_placeholder_its_lead_minted. The one remaining local failure, test_the_second_port_reports_a_spend_cap_it_cannot_price, is this machine's missing ai package in adapters/typescript/node_modules, unrelated.

Not in this PR: the TypeScript second port has no placeholders yet; BMH also refuses a placeholder in a durable memory write and keys an at-most-once claim on the real value, which can follow as separate proposals.

🤖 Generated with Claude Code

A lead that hands a charge to its cashier hid the card one way, because
the lead uses no action that gets hidden values itself, so the cashier's
action could never get the number back; and a placeholder the run's
vault did not hold was sent to the tool as text.

- AgentSpec.team_gets_hidden: a member of the agent's team, at any depth,
  uses such an action; such a lead keeps hidden values as placeholders.
- run(vault=...): the request's vault rides the grant to every member, as
  the board does (declared host-supplied), so the member's action gets back
  the card its lead hid.
- Vault.unknown: a placeholder the request does not hold stops the call;
  the model is told which one.
- spec help, CHANGELOG, README counts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@jithinAB

Copy link
Copy Markdown
Contributor Author

CI: everything is green. newest-pydantic-ai fails only master's own 5 test_parity cases (the installed Pydantic AI 2.x names not yet in pydantic_ai_registry.yaml, and O7-1), the same 5 master fails. Branch is on current master 0e593bb. Marking ready and merging, per the standing rule for PACT PRs from BMH lanes.

@jithinAB
jithinAB marked this pull request as ready for review November 14, 2026 23:30
@jithinAB
jithinAB merged commit 9e8f3ea into master Nov 14, 2026
4 of 5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant