Affordance
Interface: Affordance
Defined in: src/atom/types.ts:740
Properties
binding?
optionalbinding?:Binding
Defined in: src/atom/types.ts:749
Optional since D18: a spine tool may exist with only its description (plannable/tour-able) and gain a binding or handler at mount time. The v1 fluent builder still requires it at authoring.
blockedBecause?
optionalblockedBecause?:BlockedBecause| (() =>BlockedBecause|undefined)
Defined in: src/atom/types.ts:784
The app's own reason this control is off, compiled from
ActionDef.blockedBecause at either authoring door. The OBJECT form is
owned by the graph (cloned, frozen); the FUNCTION form stays by reference,
because it is code — like a validator, and like the value reader holds
takes — and is called fresh at every row assembly.
Served ONLY while the row is enabled: false (see
AvailableEdge.blockedBecause). Declaring it changes nothing about a
live control.
concurrency?
optionalconcurrency?:ConcurrencyPolicy
Defined in: src/atom/types.ts:818
Whether a second fire may overlap an unresolved first, compiled verbatim
from ActionDef.concurrency. Absent means 'parallel' — what every release
before this one did. See ConcurrencyPolicy.
description
description:
string
Defined in: src/atom/types.ts:743
descriptionSource?
optionaldescriptionSource?:"declared"|"registration"
Defined in: src/atom/types.ts:826
Where the planner-facing description came from. Both classes are developer-AUTHORED source-code literals (the firewall holds either way); the marker keeps the origin auditable. Default 'declared'.
effect?
optionaleffect?:Effect
Defined in: src/atom/types.ts:751
enabledWhen?
optionalenabledWhen?:WhereFilter<Record<string,unknown>>
Defined in: src/atom/types.ts:772
Declarative DISABLEDNESS — distinct from guard, which decides whether the
edge exists here at all. A failed guard HIDES the edge; a false
enabledWhen SERVES it carrying enabled: false (a greyed button an agent
can see) and refuses an execution fire as TOOL_DISABLED. Authored via
ActionDef.enabledWhen, ideally from the same expression that renders
<button disabled={…}>. Keys it cannot evaluate never disable anything:
the library does not guess a control greyed out.
freshness?
optionalfreshness?:FreshnessPolicy
Defined in: src/atom/types.ts:812
This control's own freshness answers, compiled verbatim from
ActionDef.freshness. Absent means the session default answers for it, and
an unanswered axis is 'disclose' — today's behaviour. See
FreshnessPolicy.
guard?
optionalguard?:WhereFilter<Record<string,unknown>>
Defined in: src/atom/types.ts:750
highEffect
highEffect:
boolean
Defined in: src/atom/types.ts:819
humanDecides?
optionalhumanDecides?:HumanDecides
Defined in: src/atom/types.ts:791
The app's declaration that this control's DECISION belongs to a person,
compiled verbatim from ActionDef.humanDecides at either authoring door.
See HumanDecides. Absent means no ownership was declared — never
"the agent's to make", which the library cannot know.
id
id:
string
Defined in: src/atom/types.ts:741
noInput?
optionalnoInput?:true
Defined in: src/atom/types.ts:760
True when the author declared 'none': this action takes NO input, and a
caller sending one is refused. Compiled as a FLAG with schema left
undefined — deliberately not a synthetic empty schema, so every surface
that branches on "no schema declared" (MCP's no-params arm, the fire-time
shape gate) stays byte-identical to what it was.
observability?
optionalobservability?:Observability
Defined in: src/atom/types.ts:805
How this action's effect can be SEEN, compiled verbatim from
ActionDef.observability at either authoring door. See
Observability. Absent means the app did not say — and under
EffectPolicy that absence is what a high-effect fire is refused for.
on
on:
string[]
Defined in: src/atom/types.ts:742
principalPolicy?
optionalprincipalPolicy?:PrincipalPolicy
Defined in: src/atom/types.ts:798
The app's declaration about WHO may perform this and whose choice it is,
compiled verbatim from ActionDef.principalPolicy at either authoring door.
See PrincipalPolicy. Absent means nothing was declared — never
"anyone may", which the library cannot know.
role
role:
CanonicalRole
Defined in: src/atom/types.ts:820
schema?
optionalschema?:unknown
Defined in: src/atom/types.ts:752
verify?
optionalverify?:VerifyContract
Defined in: src/atom/types.ts:762
The app's own post-settlement check that this action really happened.