Build many focused workspace apps that compose through agent discovery and A2A. Use when designing headless mini-apps or cross-app workflows.
66
80%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Fix and improve this skill with Tessl
tessl review fix ./.agents/skills/composable-mini-apps/SKILL.mdPrefer many one-job apps in a workspace over one oversized app. A headless app can own a provider, dataset, workflow, or specialist action surface without a full UI; the main agent composes those apps through discovery and A2A.
package.json description, and
action names that describe the job it owns.packages/shared;
keep the workflow actions in separate apps.The main agent should discover available siblings before assuming capability:
<available-apps> block built from
discoverAgents(). Workspace siblings are layered in by
discoverWorkspaceAgents(). It carries one line per app — enough to know a
sibling exists, not enough to know what it can do.describe-workspace-apps tool for actual capability.
It reads each peer's live /.well-known/agent-card.json and returns their
callable action names; pass app: "<id>" for one peer's full list with
descriptions. Call it before building something a sibling may already own,
before telling a user what is or is not possible across apps, and whenever
someone asks which app to use for a job.package.json description (which flows into the workspace manifest and the
<available-apps> block), and its capabilities belong in its exposed
actions — both of which describe-workspace-apps reads live.GET /_agent-native/agents?selfAppId=<app-id>.invokeAgent() / agent-native invoke) when they need to call an app by
id, name, or URL.call-agent with the sibling app id when another app
owns the work or data. Never call the current app through call-agent; use
local actions instead.invokeAgentAction() or call-agent with action + input. This preserves
the receiver's credentials and access checks while skipping its second model
loop. Use prompt-based invokeAgent() only when the sibling must reason,
synthesize, mutate, or perform a multi-step workflow.Send narrow prompts to siblings: name the exact question, relevant ids, date ranges, and expected output shape. Preserve returned ids and URLs verbatim.
Mini-apps should hand off compact artifacts, not giant pasted transcripts or provider dumps. When a mini-app creates something another app may use, return or store an artifact with:
artifactType - what kind of output this is, such as deal-set,
call-evidence, brief, dashboard, or report.artifactId - the stable app-owned id, file path, or resource id.createdAt - an ISO timestamp.source - provider/app/source ids used to create it.summary - a short human-readable explanation.items or records - the bounded structured data downstream apps need.links - fully qualified URLs for user-visible artifacts.Downstream apps should receive artifact ids, URLs, and narrow follow-up questions. If a downstream app needs more detail, it should call back to the artifact-owning app instead of asking the orchestrator to paste the whole corpus into a prompt.
Example: hubspot-pipeline returns { artifactType: "deal-set", artifactId: "hubspot-pipeline:deal-set:2026-06-18" }. deal-brief passes
that id to gong-evidence, which returns a call-evidence artifact id and
URLs. deal-brief then synthesizes the final brief from the artifact ids and
bounded summaries.
Provider-specific actions are shortcuts, not limits. When the upstream API can
answer the question better than a first-class shortcut, call
provider-api-catalog and provider-api-docs as needed, then
provider-api-request against the real provider endpoint. For broad joins,
searches, or absence claims, stage the bounded corpus with stageAs and reduce
it with query-staged-dataset or code.
When composing apps, make the provider-owning mini-app do those
provider-api-request calls. The orchestrator should delegate a bounded job;
it should not reimplement every provider endpoint locally.
For a sales-intelligence workspace, split the job into small apps:
| App | Owns | Calls |
|---|---|---|
hubspot-pipeline | CRM deals, contacts, companies, associations | provider-api-request with provider hubspot |
gong-evidence | Calls, transcripts, snippets, speaker evidence | provider-api-request with provider gong |
knowledge-base | Internal docs, pricing rules, playbooks | local search/read actions |
deal-brief | Orchestration and final brief | invokeAgent() or call-agent to the three apps |
Flow: deal-brief asks hubspot-pipeline for the target account and open
deals, asks gong-evidence for recent transcript evidence about those deals,
asks knowledge-base for relevant playbook guidance, then synthesizes the
answer. That is a HubSpot→Gong→knowledge-base chain made of focused apps,
not a single app that clones every provider integration.
provider-api-request can express
the upstream API safely.c1ee18b
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.