Skip to content

V9: A second tool shape, and the egress gate #28

Description

@afogel

Master doc: docs/shaping/acs-reference-impl-slices.md §V9 — authoritative for this slice's scope. Measurements in docs/shaping/spike-unreached-gates.md.

Demo: Ask for a web fetch of a host the allowlist does not cover. AGT's stock egress gate denies it — a fourth gate class live, from one data.json key and no code. Then ask for the same destination over curl, and it denies again, this time from a Guardian-extracted destination. Both verdicts come from the same unforked rule.

Blocked by: #9
Plan: (added when planned)

Why there is code in this at all

The demo's first half needs none. egress.rego's first default destination path is snapshot.tool_call.args.url, and assemblePreToolCallSnapshot already lands ACS arguments.url.value there — measured allow/deny with one data.json key and one manifest tools: entry.

The code is what makes a second tool shape work at all. AGT's intervention_point is additionalProperties: false with exactly one policy_target, and the shipped $.tool_call.args.command denies a benign WebFetch call with runtime_error:path_missing before any rule runs. It has never bitten because the deployment governs exactly one tool.

Scope boundary

Only the request gate's matcher widens. PostToolUse declares outputs.from: $.tool_response.stdout; a fetch result has no stdout, so buildPayload throws and under the shipped proceed posture the step runs ungoverned. No stock gate reads a fetch's output, so widening it buys nothing and costs a fail-open. The general form is risk row 24 and is unassigned.

Amendments

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    sliceOne vertical slice of a shaped track

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions