Pre-build once; invoke one Action at a time
Creators test source with the CLI. The platform turns that source into an immutable runtime before use, then the Controller starts a fresh Action process for each invocation.
Delivery details stay out of the repository
- The SDK validates
shimpz.tomland every directactions/*.pyfile. - It statically extracts the English message catalog without importing Assistant code.
- It generates the canonical machine contract, including that catalog.
- The platform resolves and locks dependencies and creates the runtime/container files.
- The platform adds the language pack for the catalog; for a Local snapshot,
shimpz assistant stagemakes it on your machine. - The immutable artifact is admitted against the reviewed manifest, contract, and language pack.
The catalog and language-pack steps require SDK 0.7.1 and CLI 0.9.0 or newer.
Validate before and after execution
- The Brain selects a reviewed Action and supplies JSON arguments.
- The Controller validates those arguments against the generated input schema.
- It writes
{input, stored_inputs, files, operation_id}to bounded stdin.stored_inputsis always present: it lists the ids of the Stored Inputs the Action declares whose value that Team already keeps, up to eight, and is empty otherwise. No credential is ever part of an invocation: Team keeps every Integration token and Stored Input value and adds it to the Action's provider calls itself.filesis empty unless the Action takes a file, andoperation_idnames one logical operation and stays the same across its replays. A replay also carries the boundedresponsestranscript. - It executes
/usr/local/bin/shimpz-action <action-id>in the Assistant runtime. - The SDK loads the reviewed project, selects the named Action, and runs its async body once.
- The Controller bounds and validates the direct JSON result before the Brain can use it.
Each invocation has an 8-second execution deadline. The encoded request is limited to 512 KiB, or 12 MiB when it carries delivered file content, and the direct response to 512 KiB, before schema and private-value validation.
Team checks each credential's routes before it sends a call
An Action reaches a provider only through await ctx.fetch(...). Before Team places any Stored Input
on a call, it matches the call against the routes of every Stored Input the
Action declares for that host.
- Team reads the path exactly as sent, before the query, and never normalizes it. A path with percent-encoding, an
empty or
.or..segment, a character outside the unreserved set, or a trailing/matches no route. - A segment that names a credential endpoint, such as
api-keysoraccess_token, is refused even where a*would match it. - A route matches when its method is the call's method, it has as many segments as the path, and each literal
equals the call's segment, while each
*takes exactly one. - On a route with
queryselectors, the call must carry each selector exactly once, under the exact name, with one of the listed raw values. Such a call is also refused when its query contains;or a parameter name outside the unreserved set. - Every Stored Input declared for the host must admit the call. If one does not, Team sends nothing, places no
credential, and
ctx.fetchraisesFetchErrorwith coderefused.
Widen a route only to an endpoint your Actions actually call, and keep the routes of Stored Inputs that share a host identical.
Authority stays outside the workload
- The artifact is pinned by digest and its manifest and generated contract must match review.
- Team identity, OAuth custody, validation, and execution journals remain Controller-owned.
- Integration tokens never travel through the Brain, environment, command arguments, or logs.
- Outbound traffic is limited to reviewed
allowed_hoststhrough authenticated egress. - Malformed, oversized, unexpected, or private-value-bearing results fail closed.