You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Flight 10 of the published-skills factual sweep. Every corrected claim was
settled against the implementing code (packages/spec ai + ui schemas,
packages/runtime action-execution, packages/mcp skill-prompts, the platform
tool/object-name registries and the liveness ledgers), never against another
document, with executed parse probes where the claim is behaviour-bearing.
Net: -15 tokens, -10 lines across the package; both ratcheted files stay under
their existing ceilings (no ceiling touched).
Claude-Session: https://claude.ai/code/session_01EnE7G31tqbxN1rqpQmzurT
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
|`skills`| Array of skill names — **the** capability model (ADR-0064)|
168
+
|~~`tools`~~|REMOVED in protocol 17 — the inline slot resolved names against the *full* registry with no surface check. A parse error now; move each reference into a skill|
170
169
|`surface`|`'ask' \| 'build'` — the product surface this agent is (default `'ask'`) |
171
170
|`model`| LLM model configuration — `provider`, `model`, `temperature`, `maxTokens`, `topP`|
172
171
|~~`knowledge`~~| REMOVED in protocol 17 — declaring sources/indexes on an agent never scoped retrieval (`search_knowledge` takes `sourceIds` from the LLM's tool-call arguments). Restrict at the knowledge-service/source level; describe intended grounding in `instructions`|
> **Cloud / EE runtime.**`registerActionsAsTools()`, `AIServicePlugin`, and
349
340
> the HITL approval queue below ship in `@objectstack/service-ai` — the closed
350
341
> cloud / Enterprise runtime, not an open package. On the open edition, expose
351
342
> actions to your own AI via `@objectstack/mcp` instead.
352
343
353
-
You usually **don't author tool definitions by hand** for action invocation. Every`Action` you attach to an object via `defineObject({ actions: [...] })`is auto-exposed as a tool named `action_<actionName>` by `registerActionsAsTools()` (invoked from `AIServicePlugin`).
344
+
You usually **don't author tool definitions by hand** for action invocation. An`Action` you attach to an object via `defineObject({ actions: [...] })`becomes a tool named `action_<actionName>`**only when it opts in** — `ai.exposed: true` (default `false`) plus an `ai.description` of ≥ 40 chars, refused by the parse without it (ADR-0011). `registerActionsAsTools()` (from `AIServicePlugin`) walks the opted-in ones; exposure is never automatic, and there is no opt-out key.
354
345
355
346
Three action types dispatch headlessly:
356
347
@@ -360,10 +351,9 @@ Three action types dispatch headlessly:
360
351
|`api`| HTTP call to `action.target` (`fetch`-based by default) |`AIServicePlugin({ apiActionBaseUrl, apiActionHeaders })` or custom `apiClient`|
361
352
|`flow`|`IAutomationService.execute(target, { triggerData })`|`automation` service registered with the kernel |
362
353
363
-
**Skipped automatically:**
354
+
**Skipped even when opted in:**
364
355
- UI-only types (`url`, `modal`, `form`).
365
-
- Dangerous variants (`confirmText` set, `mode: 'delete'`, `variant: 'danger'`) — **unless** the plugin is started with `enableActionApproval: true`, in which case they route through the HITL approval queue (see below).
366
-
- Owner opt-outs (`aiExposed: false`).
356
+
- Dangerous variants — the declared `mode: 'delete'` / `variant: 'danger'` only (`confirmText` is dialog copy, *not* a destructive signal; `ai.requiresConfirmation` overrides either way) — **unless** the plugin is started with `enableActionApproval: true`, in which case they route through the HITL approval queue (see below).
367
357
368
358
**`type:'api'` body assembly** (last wins): user params → `recordIdParam` (using `recordIdField`, default `'id'`) → `bodyExtra`. `bodyShape: { wrap: 'data' }` nests user params under `data` while keeping `recordIdParam` flat.
369
359
@@ -537,10 +527,10 @@ On validation failure the runtime retries by default
537
527
more. Be specific about what the agent should and should not do.
538
528
2.**Too many tools per skill.** Keep skills focused (3–8 tools). If a skill
539
529
has 15+ tools, split it.
540
-
3.**Missing guardrails and approval gates.**Define `blockedTopics` (plus the
541
-
token / time budgets) in agent `guardrails`; for destructive operations put
542
-
a human in the loop with a gate that is **actually enforced** —
543
-
`enableActionApproval: true` (HITL queue, cloud) for auto-exposed actions,
530
+
3.**Mistaking `guardrails` for a gate.**`guardrails` / `memory` /
531
+
`structuredOutput` are declared only — no runtime reads them, and real
532
+
limits come from the quota service. For a gate that is **enforced**, use
533
+
`enableActionApproval: true` (HITL queue, cloud) for AI-exposed actions,
544
534
`ai.requiresConfirmation` on the **action**, or `approval: 'always'` on an
545
535
MCP tool binding. AI metadata edits are already gated: they land as drafts a
546
536
human must publish (ADR-0033).
@@ -550,8 +540,8 @@ On validation failure the runtime retries by default
550
540
There is no `requireApprovalFor` field.
551
541
4.**Ignoring tool descriptions.** The LLM uses tool `description` to decide
552
542
when to call it. Poor descriptions = wrong tool selection.
553
-
5.**Not testing trigger phrases.**Ambiguous trigger phrases cause skill
554
-
conflicts. Test with edge-case inputs.
543
+
5.**Expecting a phrase to activate a skill.**Nothing matches phrases; write
544
+
routing as `triggerConditions` and intent in `description`/`instructions`.
555
545
6.**Indexing everything.** A knowledge source without a `where` filter and
556
546
curated `contentFields` fills the index with drafts and boilerplate that
557
547
pollute retrieval. Source hygiene is the metadata's job; relevance tuning
@@ -565,7 +555,7 @@ Reference layout for a scaffolded app:
| Tool metadata |`src/tools/query-leads.tool.ts`|`defineTool` — JSON-Schema `parameters`; a discovery projection, not an executor (see caveat above) |
570
560
| Knowledge source |`src/knowledge/sales-kb.ts`|`KnowledgeSourceSchema` metadata, registered at runtime via `IKnowledgeService.registerSource()`|
571
561
| Central registration |`defineStack({ skills: [...], tools: [...] })`|`agents` / `tools` / `skills` are the only AI stack collections — knowledge sources have none; agents are platform-supplied |
0 commit comments