Manifest Format Reference¶
This page explains the Toolkit Format — the portable, self-describing structure used for toolkit distribution and import/export workflows.
Overview¶
A toolkit is a provenance wrapper around a manifest:
- Provenance Wrapper: Metadata about the toolkit (name, slug, version, license)
- Manifest: The entity definitions (templates, next steps, action buttons, shortcuts)
Both the Partner Admin API and the App API import/export flows use this same wrapper structure. The distinction lies in governance (who owns the installed entities) and distribution channel (API-managed vs. file-based).
Toolkit Format Structure¶
{
"name": "Robert's Rules Essentials",
"slug": "roberts-rules-essentials",
"version": "1.0.0",
"license": "MIT",
"license_url": "https://opensource.org/licenses/MIT",
"manifest": {
"schema_version": "1",
"toolkit_prompt": "You are a parliamentary procedure assistant...",
"templates": [...],
"next_steps": [...],
"action_buttons": [...],
"shortcuts": [...]
}
}
Provenance Fields (Root Level)¶
| Field | Required | Description |
|---|---|---|
name | Yes | Human-readable toolkit name |
slug | Yes | URL-safe identifier (lowercase, hyphens). Used for deduplication and upgrades |
version | Yes | Semantic version (e.g., 1.0.0). Used for upgrade detection |
license | No | SPDX license identifier (e.g., MIT, Apache-2.0) |
license_url | No | URL to full license text |
Manifest Fields¶
| Field | Description |
|---|---|
schema_version | Manifest schema version (currently "1"). Enables forward compatibility |
toolkit_prompt | System prompt for AI-powered next steps within this toolkit |
templates | Array of meeting template definitions |
next_steps | Array of next step definitions |
action_buttons | Array of action button definitions |
shortcuts | Array of AI shortcut definitions |
workflows | Array of workflow template definitions |
canvas_templates | Array of canvas template definitions |
usage_guidance | Optional user-facing documentation for the toolkit |
Workflow Role Mappings¶
Workflows often include review nodes assigned to semantic roles (e.g., "Secretary", "Chair", "Product Owner"). The default_role_mappings field on a workflow provides portable defaults for resolving these roles.
Structure¶
{
"workflows": [
{
"spec": { ... },
"default_role_mappings": {
"Secretary": { "group": "meeting_editor" },
"Chair": {
"group": "meeting_owner",
"fallback": { "group": "workspace_owner" }
},
"Finance": {
"group": "workspace_admin",
"optional": true
}
}
}
]
}
Role Mapping Target¶
Each mapping value is a RoleMappingTarget object with one of two forms:
User Target — Assign to a specific user by email (portable across environments):
Group Target — Assign to a participant group:
Supported Groups¶
| Group | Scope | Cardinality | Description |
|---|---|---|---|
meeting_owner | Meeting | Single | User who owns the meeting |
meeting_editor | Meeting | Multiple | Editors (includes owner) |
meeting_viewer | Meeting | Multiple | Viewers (includes editors, owner) |
workspace_owner | Workspace | Single | Owner of the meeting's workspace |
workspace_admin | Workspace | Multiple | Admins (includes owner) |
workspace_participant | Workspace | Multiple | Meeting participants from the workspace |
workspace_any | Workspace | Multiple | Any member of the meeting's workspace |
workflow_initiator | Workflow | Single | User who started the run (manual only) |
Note: Workspace-scoped groups resolve against the meeting's workspace (where the meeting was created or, for duplicates, where it was copied).
Fallback Chains¶
When a group resolves to an empty set (e.g., no workspace admins), the fallback property specifies the next target to try. Fallbacks can chain recursively:
{
"group": "workspace_admin",
"fallback": {
"group": "meeting_owner",
"fallback": { "email": "default-reviewer@example.com" }
}
}
Resolution Behavior¶
| Scenario | Behavior |
|---|---|
| Group resolves to single user | Assigned to that user |
| Group resolves to multiple users | First to act completes the task; all see it |
| Group is empty, has fallback | Try the fallback target |
Group is empty, no fallback, optional: true | Skip this role; workflow proceeds |
Group is empty, no fallback, optional: false | Workflow fails to start |
workflow_initiator on automated run | Fails resolution (no human initiator) |
Runtime Overrides¶
When a user manually starts a workflow, they can override the default mappings via the role assignment UI. The defaults pre-populate the assignment dialog, but any role can be reassigned to a different user or group before execution.
Entity Referencing¶
Entities within a manifest reference each other using $id and $ref:
{
"next_steps": [
{
"spec": {
"$id": "ns-meeting-summary",
"name": "Meeting Summary",
...
},
"action_buttons": [
{ "action_button": { "$ref": "ab-email-summary" } }
]
}
],
"action_buttons": [
{
"spec": {
"$id": "ab-email-summary",
"name": "Email Summary",
...
}
}
]
}
$id: Declares a manifest-local identifier for an entity$ref: References another entity by its$id
Upon installation, these local identifiers are resolved to database UUIDs. The installation response includes an entity map showing the $id → UUID mappings.
API Channels & Governance¶
The same toolkit format is used by two different API channels, with different governance outcomes:
| Channel | Endpoint | Resulting Ownership |
|---|---|---|
| Partner Admin API | POST /v1/partner/admin/toolkits | PARTNER — Partner controls the entities |
| App API Import | POST /api/toolkits/import | WORKSPACE — Workspace controls the entities |
Partner-Owned Toolkits¶
When a toolkit is created via the Partner Admin API:
- Entities are owned by the partner app (
ownership_type: PARTNER) - The partner can push updates via the versioning API
- Workspaces install/uninstall but cannot modify the entities
- Updates propagate to all installed workspaces
Workspace-Owned Toolkits¶
When a toolkit is imported via the App API:
- Entities are owned by the importing workspace (
ownership_type: WORKSPACE) - The workspace can edit entities directly
- No automatic updates from external sources
- Ideal for customization and local iteration
Slug Stability¶
The slug field serves as a stable identifier across imports and upgrades:
- Deduplication: If you import a toolkit with the same slug, the system updates existing entities
- Portability: Export a toolkit, share the file, import elsewhere — slugs maintain identity
- Upgrade Detection: When a partner publishes a new version, the slug links to prior installations
Best practice: Use descriptive, hierarchical slugs like acme-sales-discovery or roberts-rules-essentials.
Schema Versioning¶
The schema_version field in the manifest enables forward compatibility:
- Current version:
"1" - Future versions may add new entity types or fields
- The API will reject manifests with unsupported schema versions
- Older manifests remain compatible as the schema evolves
Worked Examples¶
See the Robert's Rules toolkit examples for complete, production-ready toolkit files:
roberts-rules-essentials.json— Simplified parliamentary procedureroberts-rules-standard.json— Full Robert's Rules implementation
These examples demonstrate all entity types, cross-references, and best practices.
Related Documentation¶
- Toolkit Overview — Introduction and quick start
- Icon Reference — Visual gallery of supported icons
- Ownership & Distribution — Governance models
- Entity Lifecycle — How entities flow through installation