✖ http_400: <CODE>: <detail>; <detail> and exits 10; every violation is in the one message with its field path.
Verified against lua-cli 3.33.0.
What installers agree to and keep
The install screen shows, and the installer agrees to: every connection with its scopes, the instruction of every trigger, the workflows the version ships with their schedules, the required env contract keys, theonInstall and onUninstall hooks, and the persona template text. The first four form the consent surface whose hash decides whether a later version needs re-consent.
A creator push (a publish that auto-applies, or lua marketplace template apply) replaces the template’s managed primitives (skills, webhooks, jobs, preprocessors, postprocessors, triggers, workflows) and the frozen modelSettings. It never changes what the installer owns:
- env values, set with
lua env, including the keys the install introduced; - a persona the installer edited or already had (
personaSkipped: trueon the result); - which triggers are armed and their schedule values; an added trigger lands disabled, and a paused or auto-disabled schedule stays parked;
- which connection satisfies each capability;
- the model: the template’s model seeds only an agent that had none, on its first install;
- channels and the agent’s name.
MODIFIED_SINCE_INSTALL, naming the primitives, until the installer re-sends the install over REST with acceptModifiedPrimitives ("<kind>/<key>" entries) on the agent templates API. When a version changes the consent surface, the installer re-consents by installing that version from a project on the agent:
Lint codes
The secret patterns are named
private-key-block, aws-access-key-id, google-api-key, slack-token, jwt, and generic-secret-assignment (an api_key, secret, token, or password assigned a quoted value of 16 or more characters). They run over skill context, conditions, tool code and descriptions, webhook, job, processor and trigger code and descriptions, job prompts, workflow definitions, and env contract descriptions.
Two refusals are not lints: Source agent has no active version — run `lua version create` + `lua version promote` first when nothing is promoted, and Missing required environment variables: <keys> at install when the env contract is unmet.
showIf rules
AparamsMeta entry or a persona var may carry showIf: { param, equals }. The rules, each reported as <where>.showIf…:
paramnames another declared key, never itself. Env contract keys and persona var names share one namespace; a param may depend only on another env contract key, a persona var on either.equalsis a non-empty list of at most 20 unique, non-empty strings. When the controller declares anenum, every value must be a member; when it is aboolean, onlytrueandfalsematch.- The chain of
showIfrules is acyclic; a cycle is named in the message. - A conditional persona var carries a
default, because its slot must resolve while hidden.
equals, judged on the submitted value, else the stored value, else the declared default. A hidden field is neither required nor validated, and any value for it is cleared; the install result lists those keys as hiddenParamsCleared.
Consent surface
Each version carries a hash of its consent surface. The surface is:- every connection:
key,capability,required,ownerType, and its platforms with their scopes; - the union of declared OAuth scopes;
- the instruction of every trigger and declared connection-event trigger;
- the required env contract keys;
- for versions that include workflows, each workflow’s definition identity, agent-step prompts, approvers, role references, schedule, and structural settings.
onInstall and onUninstall and the persona template text, and the manifest’s runNote says whether a workflow schedule runs as the installer or as the system.
When a version’s hash differs from the one an install consented to, a creator push onto that install is refused with RECONSENT_REQUIRED and the install is marked as waiting, whether or not it allows creator updates; the installer re-installs at that version to accept. A version whose surface is unchanged, however much code changed, flows under standing consent.
Update consent
An install opts in with--allow-creator-updates on lua marketplace template install; the default is off. It can be changed later with PATCH /agents/:agentId/templates/:templateId on the agent templates API; no CLI action does it.
- Publishing a private template applies the version to every install that allows creator updates and is on an older version, unless
--skip-auto-applyis passed. Each target goes through the same gates as a manualapply: consent, the target organization’s template policy, and the re-consent check. - Publishing a public template defers the same fan-out until the version is approved, and skips it if a newer version has been approved by then.
- A manual
applyonto an install that does not allow creator updates, or whose organization’s policy blocks the template, fails that target withTarget agent is not eligible for creator updates. - What a creator update may and may not change is listed under What installers agree to and keep.
Visibility and review
A template isprivate by default: only the creator organization can find and install it. A public template is reviewed per version; each version carries approvalStatus of pending, approved, or rejected, and installers outside the creator organization are offered approved versions only. An install that resolves to no approved version is refused with TEMPLATE_NOT_APPROVED; a template with no version at all with TEMPLATE_NO_VERSIONS. The creator organization can install a pending version to test it.
The served manifest’s installable is true when the version is not deprecated and, for a public template, approved. Unlisting a template refuses fresh installs with TEMPLATE_UNLISTED; agents that already have it keep running and can still be updated. An organization’s template policy can allow a template, require approval (the install is queued as a request), or block it (POLICY_BLOCKED).
See also
- Template manifest — the fields these lints guard
- Lifecycle hooks — hook and
installPolicylints - Publish a template — where the refusals appear
- Install and apply — the installer’s side of consent
lua marketplace— exit codes

