mirror of
https://github.com/paperclipai/paperclip.git
synced 2026-10-26 18:31:34 +01:00
## Thinking Path > - Paperclip is the open source app people use to manage AI agents for work. > - The Runner gives agents tools to change company resources. > - Users need agents to save reusable skills during a task. > - A saved skill needs a visible result that users can inspect and edit. > - This pull request adds `create_skill` and a task feed card linked to Skill Studio. > - Users can open the saved skill from the task and edit the same resource. ## Linked Issues or Issue Description **Subsystem affected** Runner tools, company skill storage, task feed, and Skill Studio. **Problem or motivation** The Runner has no dedicated tool to create a company skill. A user cannot follow a creation result from the task feed to the saved skill. **Proposed solution** Add a company-scoped `create_skill` tool. Save the skill with the existing company policy. Add one creation card to the task. Open a named sidebar tab from that card. Let the user open the same skill in Skill Studio. **Alternatives considered** An agent can write a local file, but that file is not a company skill. A second document copy in the task would become stale after a Studio edit. The sidebar therefore reads the saved skill directly. **Roadmap alignment** This extends the shipped Skills Manager, Skill Studio, and Skills Store milestone. The maintainer requested and approved this scope. Search found no duplicate `create_skill` PR or issue. Related UI validation work: #8715. This PR does not change that validation display. ## What Changed - Add the real Runner tool, its contract, and its mock implementation. - Validate the complete SKILL.md and derive company, task, agent, and run identity from authentication. - Apply the existing company skill policy. Do not assign the skill to an agent. - Make keyed retries return one skill and one creation event. Reject conflicting retries. - Make concurrent file creation safe. Never replace an existing published skill during creation. - Add a creation card, a named sidebar tab, and an Open in Skill Studio action. - Show saved Studio edits when the user returns to the task. - Add storage, policy, mode, retry, UI, and Product E2E tests. Document the tool. - Fix deleted-name reuse, onboarding panel persistence, immediate feed refresh, and mock validation parity from review. - Serialize Studio file edits and renames with skill deletion and recreation. Reject stale editor requests before they can change a replacement skill. - Generate the standalone mock parser and validator from the production contract. Use portable UUIDs so the browser scenario bundle builds. ## Verification - All latest-head PR checks pass on `145dd76a5`, including all server shards, browser E2E, Runner verification, build, typecheck, and release dry run. Greptile: 5/5 with no open findings. An interrupted CI runner was retried successfully. - `pnpm -r typecheck`: passed. - `pnpm build`: passed. - `pnpm check:token-gates`: passed. - Review regressions: 73 storage tests, 6 real API tests, 63 UI tests, and 61 semantic runtime tests passed. Parser synchronization passed. - CI exposed existing fire-and-forget Sentry test races. Reproduced the resumption race locally, then synchronized the related sweep and finalizer assertions on the actual report; all 27 tests across the three affected files pass. - Runner scenario browser build and strict content-security-policy check: passed. - Runner suite: 2,012 tests passed; 10 skipped. - `pnpm test:run`: the general-server batch had 12,416 passes and two failures. The old tool-count assertion was fixed; all 16 authority tests then passed. The chat webhook test had a socket error; it passed four isolated reruns. - Both workspace test groups passed. The isolated route suites completed. Two socket failures in the initial route batches passed on individual reruns; all remaining 61 files passed. - Product E2E `create-skill-studio`: passed with local Codex and local ACPX Claude. - Manual browser test: submit a task, observe the real tool call and creation card, open the sidebar, edit in Studio, save, and return. The task reached Done. The saved second revision and sidebar tab survived a server restart. - The new companion headless Runner Eval passed. Companion coverage PR: https://github.com/paperclipai/paperclip-evals/pull/23. Daytona was not run because no immutable runner image was configured. ## Risks - Database writes and local file writes cannot share one transaction. Recovery accepts only an exact file-for-file retry after a database rollback. Conflicting files remain untouched. - The sidebar displays the current skill. The feed card remains the historical creation receipt. - No database migration, dependency, or workflow change is included. - Remote Daytona behavior still needs a run with a configured immutable image. ## Model Used OpenAI GPT-6 (`gpt-6-astra`) handled design, integration, review, and browser verification. OpenAI `gpt-5.6-luna` assisted with bounded implementation and eval work. Both used code execution and tool access. The host did not expose the context window size. ## Checklist - [x] I have included a thinking path that traces from project context to this change - [x] I have specified the model used (with version and capability details) - [x] I have checked ROADMAP.md and confirmed this PR does not duplicate planned core work - [x] I have searched GitHub for duplicate or related PRs and linked them above - [x] I have either (a) linked existing issues with `Fixes: #` / `Closes #` / `Refs #` OR (b) described the issue in-PR following the relevant issue template - [x] I have not referenced internal/instance-local Paperclip issues or links (only public GitHub `#NNN` / `github.com/paperclipai/paperclip` URLs) - [x] My branch name describes the change (e.g. `docs/...`, `fix/...`) and contains no internal Paperclip ticket id or instance-derived details - [x] I have run tests locally and they pass - [x] I have added or updated tests where applicable - [x] I have updated relevant documentation to reflect my changes - [x] I have considered and documented any risks above - [x] All Paperclip CI gates are green - [x] Greptile is 5/5 with no open P2s, recommendations, or follow-ups - [x] I will address all Greptile and reviewer comments before requesting merge --------- Co-authored-by: Paperclip <noreply@paperclip.ing>
2353 lines
57 KiB
JSON
2353 lines
57 KiB
JSON
[
|
|
{
|
|
"allowedModes": [
|
|
"standard",
|
|
"skill_test"
|
|
],
|
|
"description": "Create a reusable single-file skill in the company library. Supply a complete SKILL.md whose name and description match the inputs. This saves the skill and shows a card; it does not assign the skill to any agent. Reuse idempotencyKey on retries.",
|
|
"effect": "write",
|
|
"inputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"description": {
|
|
"maxLength": 2000,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"idempotencyKey": {
|
|
"maxLength": 240,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"markdown": {
|
|
"description": "Complete SKILL.md including name and description frontmatter and substantive instructions.",
|
|
"maxLength": 200000,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"name": {
|
|
"description": "Lowercase skill name, matching SKILL.md frontmatter.",
|
|
"maxLength": 120,
|
|
"minLength": 1,
|
|
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
"type": "string"
|
|
},
|
|
"slug": {
|
|
"description": "Optional; must equal name.",
|
|
"maxLength": 120,
|
|
"minLength": 1,
|
|
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"idempotencyKey",
|
|
"name",
|
|
"description",
|
|
"markdown"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"operationId": "create_skill",
|
|
"outputSchema": {
|
|
"additionalProperties": true,
|
|
"type": "object"
|
|
},
|
|
"placement": "optional",
|
|
"requiredClaims": [],
|
|
"schema": "paperclip.semantic-action.v1",
|
|
"title": "Create skill",
|
|
"version": 1
|
|
},
|
|
{
|
|
"allowedModes": [
|
|
"standard",
|
|
"ask",
|
|
"planning",
|
|
"skill_test"
|
|
],
|
|
"description": "Fallback only: discover Paperclip API operations when the available dedicated tools cannot express the task. Prefer dedicated tools for common operations; do not search before using them.",
|
|
"effect": "read",
|
|
"inputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"cursor": {
|
|
"maxLength": 200,
|
|
"type": "string"
|
|
},
|
|
"limit": {
|
|
"default": 5,
|
|
"maximum": 10,
|
|
"minimum": 1,
|
|
"type": "integer"
|
|
},
|
|
"query": {
|
|
"maxLength": 500,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"query"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"operationId": "search_api",
|
|
"outputSchema": {
|
|
"additionalProperties": true,
|
|
"type": "object"
|
|
},
|
|
"placement": "optional",
|
|
"requiredClaims": [
|
|
"api:discover"
|
|
],
|
|
"schema": "paperclip.semantic-action.v1",
|
|
"title": "Search the Paperclip API",
|
|
"version": 1
|
|
},
|
|
{
|
|
"allowedModes": [
|
|
"standard",
|
|
"ask",
|
|
"planning",
|
|
"skill_test"
|
|
],
|
|
"description": "Fallback only: call a discovered Paperclip API operation when dedicated tools lack the required operation or parameters. Uses your existing permissions. Prefer dedicated tools; never bypass a denial or runner lifecycle tool.",
|
|
"effect": "write",
|
|
"inputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"body": {
|
|
"anyOf": [
|
|
{
|
|
"additionalProperties": true,
|
|
"type": "object"
|
|
},
|
|
{
|
|
"items": {},
|
|
"type": "array"
|
|
},
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "number"
|
|
},
|
|
{
|
|
"type": "boolean"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"description": "Request value matching the discovered schema. For JSON object or array requests, pass the object or array directly, never a JSON-encoded string. Strings are for text bodies or endpoints whose schema explicitly accepts a string."
|
|
},
|
|
"contentType": {
|
|
"maxLength": 120,
|
|
"type": "string"
|
|
},
|
|
"files": {
|
|
"items": {
|
|
"additionalProperties": false,
|
|
"oneOf": [
|
|
{
|
|
"properties": {
|
|
"artifactId": {}
|
|
},
|
|
"required": [
|
|
"artifactId"
|
|
]
|
|
},
|
|
{
|
|
"properties": {
|
|
"path": {}
|
|
},
|
|
"required": [
|
|
"path"
|
|
]
|
|
}
|
|
],
|
|
"properties": {
|
|
"artifactId": {
|
|
"type": "string"
|
|
},
|
|
"field": {
|
|
"type": "string"
|
|
},
|
|
"path": {
|
|
"description": "File relative to the active issue workspace. Remote files must first be uploaded as an artifact.",
|
|
"type": "string"
|
|
}
|
|
},
|
|
"type": "object"
|
|
},
|
|
"maxItems": 10,
|
|
"type": "array"
|
|
},
|
|
"operationId": {
|
|
"description": "Exact operationId returned by search_api, for example GET /api/projects/{id}. Do not guess identifiers.",
|
|
"maxLength": 500,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"pathParams": {
|
|
"additionalProperties": {
|
|
"type": "string"
|
|
},
|
|
"type": "object"
|
|
},
|
|
"query": {
|
|
"additionalProperties": true,
|
|
"type": "object"
|
|
}
|
|
},
|
|
"required": [
|
|
"operationId"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"operationId": "call_api",
|
|
"outputSchema": {
|
|
"additionalProperties": true,
|
|
"type": "object"
|
|
},
|
|
"placement": "optional",
|
|
"requiredClaims": [
|
|
"api:call"
|
|
],
|
|
"schema": "paperclip.semantic-action.v1",
|
|
"title": "Call the Paperclip API",
|
|
"version": 1
|
|
},
|
|
{
|
|
"allowedModes": [
|
|
"standard",
|
|
"ask",
|
|
"planning",
|
|
"skill_test"
|
|
],
|
|
"description": "Read the active task, actor, wake context, ancestors, and budget summary.",
|
|
"effect": "read",
|
|
"inputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {},
|
|
"required": [],
|
|
"type": "object"
|
|
},
|
|
"operationId": "get_task_context",
|
|
"outputSchema": {
|
|
"additionalProperties": true,
|
|
"type": "object"
|
|
},
|
|
"placement": "always",
|
|
"requiredClaims": [],
|
|
"schema": "paperclip.semantic-action.v1",
|
|
"title": "Get active task context",
|
|
"version": 1
|
|
},
|
|
{
|
|
"allowedModes": [
|
|
"standard",
|
|
"ask",
|
|
"planning",
|
|
"skill_test"
|
|
],
|
|
"description": "Read bounded comments on the active task.",
|
|
"effect": "read",
|
|
"inputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"limit": {
|
|
"default": 50,
|
|
"maximum": 200,
|
|
"minimum": 1,
|
|
"type": "integer"
|
|
}
|
|
},
|
|
"required": [],
|
|
"type": "object"
|
|
},
|
|
"operationId": "get_task_history",
|
|
"outputSchema": {
|
|
"additionalProperties": true,
|
|
"type": "object"
|
|
},
|
|
"placement": "always",
|
|
"requiredClaims": [],
|
|
"schema": "paperclip.semantic-action.v1",
|
|
"title": "Get active task history",
|
|
"version": 1
|
|
},
|
|
{
|
|
"allowedModes": [
|
|
"standard",
|
|
"ask",
|
|
"planning",
|
|
"skill_test"
|
|
],
|
|
"description": "List revisioned documents on the active task.",
|
|
"effect": "read",
|
|
"inputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {},
|
|
"required": [],
|
|
"type": "object"
|
|
},
|
|
"operationId": "list_documents",
|
|
"outputSchema": {
|
|
"additionalProperties": true,
|
|
"type": "object"
|
|
},
|
|
"placement": "always",
|
|
"requiredClaims": [],
|
|
"schema": "paperclip.semantic-action.v1",
|
|
"title": "List task documents",
|
|
"version": 1
|
|
},
|
|
{
|
|
"allowedModes": [
|
|
"standard",
|
|
"ask",
|
|
"planning",
|
|
"skill_test"
|
|
],
|
|
"description": "Read the current revision of one active-task document.",
|
|
"effect": "read",
|
|
"inputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"key": {
|
|
"description": "Stable issue-document key.",
|
|
"maxLength": 120,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"key"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"operationId": "read_document",
|
|
"outputSchema": {
|
|
"additionalProperties": true,
|
|
"type": "object"
|
|
},
|
|
"placement": "always",
|
|
"requiredClaims": [],
|
|
"schema": "paperclip.semantic-action.v1",
|
|
"title": "Read task document",
|
|
"version": 1
|
|
},
|
|
{
|
|
"allowedModes": [
|
|
"standard",
|
|
"ask",
|
|
"planning",
|
|
"skill_test"
|
|
],
|
|
"description": "Read bounded revision history for one active-task document.",
|
|
"effect": "read",
|
|
"inputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"key": {
|
|
"description": "Stable issue-document key.",
|
|
"maxLength": 120,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"limit": {
|
|
"default": 50,
|
|
"maximum": 200,
|
|
"minimum": 1,
|
|
"type": "integer"
|
|
}
|
|
},
|
|
"required": [
|
|
"key"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"operationId": "list_document_revisions",
|
|
"outputSchema": {
|
|
"additionalProperties": true,
|
|
"type": "object"
|
|
},
|
|
"placement": "always",
|
|
"requiredClaims": [],
|
|
"schema": "paperclip.semantic-action.v1",
|
|
"title": "List document revisions",
|
|
"version": 1
|
|
},
|
|
{
|
|
"allowedModes": [
|
|
"standard",
|
|
"ask",
|
|
"planning",
|
|
"skill_test"
|
|
],
|
|
"description": "Append a durable progress comment to the active task.",
|
|
"effect": "write",
|
|
"inputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"body": {
|
|
"description": "Multiline progress update.",
|
|
"maxLength": 20000,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"idempotencyKey": {
|
|
"description": "Caller-stable retry key.",
|
|
"maxLength": 240,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"idempotencyKey",
|
|
"body"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"operationId": "report_progress",
|
|
"outputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"commandId": {
|
|
"description": "Stable command identifier.",
|
|
"maxLength": 200,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"disposition": {
|
|
"enum": [
|
|
"applied",
|
|
"duplicate"
|
|
]
|
|
},
|
|
"entityRefs": {
|
|
"description": "Entities affected by the operation.",
|
|
"items": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"maxItems": 200,
|
|
"type": "array",
|
|
"uniqueItems": true
|
|
},
|
|
"scheduledWakeIds": {
|
|
"description": "Wake identifiers scheduled by the operation.",
|
|
"items": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"maxItems": 200,
|
|
"type": "array",
|
|
"uniqueItems": true
|
|
},
|
|
"stateRevision": {
|
|
"minimum": 0,
|
|
"type": "integer"
|
|
}
|
|
},
|
|
"required": [
|
|
"commandId",
|
|
"disposition",
|
|
"stateRevision",
|
|
"entityRefs",
|
|
"scheduledWakeIds"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"placement": "always",
|
|
"requiredClaims": [],
|
|
"schema": "paperclip.semantic-action.v1",
|
|
"title": "Report durable progress",
|
|
"version": 1
|
|
},
|
|
{
|
|
"allowedModes": [
|
|
"standard",
|
|
"ask",
|
|
"planning",
|
|
"skill_test"
|
|
],
|
|
"description": "Append an answer to a status-only wake without changing task disposition.",
|
|
"effect": "write",
|
|
"inputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"body": {
|
|
"description": "Concise status answer.",
|
|
"maxLength": 20000,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"idempotencyKey": {
|
|
"description": "Caller-stable retry key.",
|
|
"maxLength": 240,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"idempotencyKey",
|
|
"body"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"operationId": "answer_status_question",
|
|
"outputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"commandId": {
|
|
"description": "Stable command identifier.",
|
|
"maxLength": 200,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"disposition": {
|
|
"enum": [
|
|
"applied",
|
|
"duplicate"
|
|
]
|
|
},
|
|
"entityRefs": {
|
|
"description": "Entities affected by the operation.",
|
|
"items": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"maxItems": 200,
|
|
"type": "array",
|
|
"uniqueItems": true
|
|
},
|
|
"scheduledWakeIds": {
|
|
"description": "Wake identifiers scheduled by the operation.",
|
|
"items": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"maxItems": 200,
|
|
"type": "array",
|
|
"uniqueItems": true
|
|
},
|
|
"stateRevision": {
|
|
"minimum": 0,
|
|
"type": "integer"
|
|
}
|
|
},
|
|
"required": [
|
|
"commandId",
|
|
"disposition",
|
|
"stateRevision",
|
|
"entityRefs",
|
|
"scheduledWakeIds"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"placement": "always",
|
|
"requiredClaims": [],
|
|
"schema": "paperclip.semantic-action.v1",
|
|
"title": "Answer status question",
|
|
"version": 1
|
|
},
|
|
{
|
|
"allowedModes": [
|
|
"standard",
|
|
"planning",
|
|
"skill_test"
|
|
],
|
|
"description": "Create or update an active-task document with optimistic revision safety.",
|
|
"effect": "write",
|
|
"inputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"baseRevisionId": {
|
|
"description": "Current revision id, or null when creating.",
|
|
"maxLength": 240,
|
|
"type": [
|
|
"string",
|
|
"null"
|
|
]
|
|
},
|
|
"body": {
|
|
"description": "Markdown document body.",
|
|
"maxLength": 200000,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"changeSummary": {
|
|
"description": "Optional revision summary.",
|
|
"maxLength": 20000,
|
|
"type": [
|
|
"string",
|
|
"null"
|
|
]
|
|
},
|
|
"idempotencyKey": {
|
|
"description": "Caller-stable retry key.",
|
|
"maxLength": 240,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"key": {
|
|
"description": "Stable issue-document key.",
|
|
"maxLength": 120,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"title": {
|
|
"description": "Document title.",
|
|
"maxLength": 300,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"idempotencyKey",
|
|
"key",
|
|
"title",
|
|
"body",
|
|
"baseRevisionId"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"operationId": "write_document",
|
|
"outputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"commandId": {
|
|
"description": "Stable command identifier.",
|
|
"maxLength": 200,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"disposition": {
|
|
"enum": [
|
|
"applied",
|
|
"duplicate"
|
|
]
|
|
},
|
|
"entityRefs": {
|
|
"description": "Entities affected by the operation.",
|
|
"items": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"maxItems": 200,
|
|
"type": "array",
|
|
"uniqueItems": true
|
|
},
|
|
"scheduledWakeIds": {
|
|
"description": "Wake identifiers scheduled by the operation.",
|
|
"items": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"maxItems": 200,
|
|
"type": "array",
|
|
"uniqueItems": true
|
|
},
|
|
"stateRevision": {
|
|
"minimum": 0,
|
|
"type": "integer"
|
|
}
|
|
},
|
|
"required": [
|
|
"commandId",
|
|
"disposition",
|
|
"stateRevision",
|
|
"entityRefs",
|
|
"scheduledWakeIds"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"placement": "always",
|
|
"requiredClaims": [],
|
|
"schema": "paperclip.semantic-action.v1",
|
|
"title": "Write revisioned document",
|
|
"version": 1
|
|
},
|
|
{
|
|
"allowedModes": [
|
|
"standard",
|
|
"ask",
|
|
"planning",
|
|
"skill_test"
|
|
],
|
|
"description": "Create a typed, durable interaction on the active task.",
|
|
"effect": "write",
|
|
"inputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"continuationPolicy": {
|
|
"enum": [
|
|
"none",
|
|
"wake_assignee",
|
|
"wake_assignee_on_accept"
|
|
]
|
|
},
|
|
"idempotencyKey": {
|
|
"description": "Caller-stable retry key.",
|
|
"maxLength": 240,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"interactionKind": {
|
|
"enum": [
|
|
"confirmation",
|
|
"checkbox",
|
|
"questions",
|
|
"suggest_tasks",
|
|
"item_verdicts"
|
|
]
|
|
},
|
|
"payload": {
|
|
"additionalProperties": true,
|
|
"type": "object"
|
|
},
|
|
"prompt": {
|
|
"description": "Question or decision prompt.",
|
|
"maxLength": 10000,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"targetRevisionId": {
|
|
"description": "Optional bound document revision.",
|
|
"maxLength": 240,
|
|
"type": [
|
|
"string",
|
|
"null"
|
|
]
|
|
},
|
|
"title": {
|
|
"description": "Interaction card title.",
|
|
"maxLength": 300,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"idempotencyKey",
|
|
"interactionKind",
|
|
"title",
|
|
"prompt",
|
|
"continuationPolicy"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"operationId": "request_human_input",
|
|
"outputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"commandId": {
|
|
"description": "Stable command identifier.",
|
|
"maxLength": 200,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"disposition": {
|
|
"enum": [
|
|
"applied",
|
|
"duplicate"
|
|
]
|
|
},
|
|
"entityRefs": {
|
|
"description": "Entities affected by the operation.",
|
|
"items": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"maxItems": 200,
|
|
"type": "array",
|
|
"uniqueItems": true
|
|
},
|
|
"scheduledWakeIds": {
|
|
"description": "Wake identifiers scheduled by the operation.",
|
|
"items": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"maxItems": 200,
|
|
"type": "array",
|
|
"uniqueItems": true
|
|
},
|
|
"stateRevision": {
|
|
"minimum": 0,
|
|
"type": "integer"
|
|
}
|
|
},
|
|
"required": [
|
|
"commandId",
|
|
"disposition",
|
|
"stateRevision",
|
|
"entityRefs",
|
|
"scheduledWakeIds"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"placement": "always",
|
|
"requiredClaims": [],
|
|
"schema": "paperclip.semantic-action.v1",
|
|
"title": "Request structured human input",
|
|
"version": 1
|
|
},
|
|
{
|
|
"allowedModes": [
|
|
"standard",
|
|
"planning",
|
|
"skill_test"
|
|
],
|
|
"description": "Register attachment metadata and its work product without returning bytes or credentials.",
|
|
"effect": "write",
|
|
"inputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"byteSize": {
|
|
"maximum": 100000000,
|
|
"minimum": 0,
|
|
"type": "integer"
|
|
},
|
|
"contentRef": {
|
|
"description": "Opaque content reference.",
|
|
"maxLength": 2000,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"contentType": {
|
|
"description": "Media type.",
|
|
"maxLength": 200,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"filename": {
|
|
"description": "Display filename.",
|
|
"maxLength": 500,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"idempotencyKey": {
|
|
"description": "Caller-stable retry key.",
|
|
"maxLength": 240,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"sha256": {
|
|
"pattern": "^[a-fA-F0-9]{64}$",
|
|
"type": "string"
|
|
},
|
|
"title": {
|
|
"description": "Work-product title.",
|
|
"maxLength": 500,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"idempotencyKey",
|
|
"filename",
|
|
"contentType",
|
|
"byteSize",
|
|
"sha256",
|
|
"contentRef",
|
|
"title"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"operationId": "register_deliverable",
|
|
"outputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"commandId": {
|
|
"description": "Stable command identifier.",
|
|
"maxLength": 200,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"disposition": {
|
|
"enum": [
|
|
"applied",
|
|
"duplicate"
|
|
]
|
|
},
|
|
"entityRefs": {
|
|
"description": "Entities affected by the operation.",
|
|
"items": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"maxItems": 200,
|
|
"type": "array",
|
|
"uniqueItems": true
|
|
},
|
|
"scheduledWakeIds": {
|
|
"description": "Wake identifiers scheduled by the operation.",
|
|
"items": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"maxItems": 200,
|
|
"type": "array",
|
|
"uniqueItems": true
|
|
},
|
|
"stateRevision": {
|
|
"minimum": 0,
|
|
"type": "integer"
|
|
}
|
|
},
|
|
"required": [
|
|
"commandId",
|
|
"disposition",
|
|
"stateRevision",
|
|
"entityRefs",
|
|
"scheduledWakeIds"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"placement": "always",
|
|
"requiredClaims": [],
|
|
"schema": "paperclip.semantic-action.v1",
|
|
"title": "Register inspectable deliverable",
|
|
"version": 1
|
|
},
|
|
{
|
|
"allowedModes": [
|
|
"standard",
|
|
"skill_test"
|
|
],
|
|
"description": "Finish the active task with a durable summary.",
|
|
"effect": "write",
|
|
"inputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"idempotencyKey": {
|
|
"description": "Caller-stable retry key.",
|
|
"maxLength": 240,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"summary": {
|
|
"description": "Completion summary.",
|
|
"maxLength": 20000,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"idempotencyKey",
|
|
"summary"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"operationId": "finish_task",
|
|
"outputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"commandId": {
|
|
"description": "Stable command identifier.",
|
|
"maxLength": 200,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"disposition": {
|
|
"enum": [
|
|
"applied",
|
|
"duplicate"
|
|
]
|
|
},
|
|
"entityRefs": {
|
|
"description": "Entities affected by the operation.",
|
|
"items": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"maxItems": 200,
|
|
"type": "array",
|
|
"uniqueItems": true
|
|
},
|
|
"scheduledWakeIds": {
|
|
"description": "Wake identifiers scheduled by the operation.",
|
|
"items": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"maxItems": 200,
|
|
"type": "array",
|
|
"uniqueItems": true
|
|
},
|
|
"stateRevision": {
|
|
"minimum": 0,
|
|
"type": "integer"
|
|
}
|
|
},
|
|
"required": [
|
|
"commandId",
|
|
"disposition",
|
|
"stateRevision",
|
|
"entityRefs",
|
|
"scheduledWakeIds"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"placement": "always",
|
|
"requiredClaims": [],
|
|
"schema": "paperclip.semantic-action.v1",
|
|
"title": "Finish active task",
|
|
"version": 1
|
|
},
|
|
{
|
|
"allowedModes": [
|
|
"standard",
|
|
"skill_test"
|
|
],
|
|
"description": "Block the active task with a durable reason and optional first-class dependencies.",
|
|
"effect": "write",
|
|
"inputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"blockedByTaskIds": {
|
|
"description": "Task identifiers that block this task.",
|
|
"items": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"maxItems": 200,
|
|
"type": "array",
|
|
"uniqueItems": true
|
|
},
|
|
"idempotencyKey": {
|
|
"description": "Caller-stable retry key.",
|
|
"maxLength": 240,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"reason": {
|
|
"description": "Block reason.",
|
|
"maxLength": 20000,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"idempotencyKey",
|
|
"reason"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"operationId": "block_task",
|
|
"outputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"commandId": {
|
|
"description": "Stable command identifier.",
|
|
"maxLength": 200,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"disposition": {
|
|
"enum": [
|
|
"applied",
|
|
"duplicate"
|
|
]
|
|
},
|
|
"entityRefs": {
|
|
"description": "Entities affected by the operation.",
|
|
"items": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"maxItems": 200,
|
|
"type": "array",
|
|
"uniqueItems": true
|
|
},
|
|
"scheduledWakeIds": {
|
|
"description": "Wake identifiers scheduled by the operation.",
|
|
"items": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"maxItems": 200,
|
|
"type": "array",
|
|
"uniqueItems": true
|
|
},
|
|
"stateRevision": {
|
|
"minimum": 0,
|
|
"type": "integer"
|
|
}
|
|
},
|
|
"required": [
|
|
"commandId",
|
|
"disposition",
|
|
"stateRevision",
|
|
"entityRefs",
|
|
"scheduledWakeIds"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"placement": "always",
|
|
"requiredClaims": [],
|
|
"schema": "paperclip.semantic-action.v1",
|
|
"title": "Block active task",
|
|
"version": 1
|
|
},
|
|
{
|
|
"allowedModes": [
|
|
"standard",
|
|
"skill_test"
|
|
],
|
|
"description": "Move the active task to review with a durable summary.",
|
|
"effect": "write",
|
|
"inputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"idempotencyKey": {
|
|
"description": "Caller-stable retry key.",
|
|
"maxLength": 240,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"summary": {
|
|
"description": "Review handoff summary.",
|
|
"maxLength": 20000,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"idempotencyKey",
|
|
"summary"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"operationId": "request_review",
|
|
"outputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"commandId": {
|
|
"description": "Stable command identifier.",
|
|
"maxLength": 200,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"disposition": {
|
|
"enum": [
|
|
"applied",
|
|
"duplicate"
|
|
]
|
|
},
|
|
"entityRefs": {
|
|
"description": "Entities affected by the operation.",
|
|
"items": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"maxItems": 200,
|
|
"type": "array",
|
|
"uniqueItems": true
|
|
},
|
|
"scheduledWakeIds": {
|
|
"description": "Wake identifiers scheduled by the operation.",
|
|
"items": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"maxItems": 200,
|
|
"type": "array",
|
|
"uniqueItems": true
|
|
},
|
|
"stateRevision": {
|
|
"minimum": 0,
|
|
"type": "integer"
|
|
}
|
|
},
|
|
"required": [
|
|
"commandId",
|
|
"disposition",
|
|
"stateRevision",
|
|
"entityRefs",
|
|
"scheduledWakeIds"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"placement": "always",
|
|
"requiredClaims": [],
|
|
"schema": "paperclip.semantic-action.v1",
|
|
"title": "Request task review",
|
|
"version": 1
|
|
},
|
|
{
|
|
"allowedModes": [
|
|
"standard",
|
|
"ask",
|
|
"planning",
|
|
"skill_test"
|
|
],
|
|
"description": "List redacted actor profiles in the run company.",
|
|
"effect": "read",
|
|
"inputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {},
|
|
"required": [],
|
|
"type": "object"
|
|
},
|
|
"operationId": "list_agents",
|
|
"outputSchema": {
|
|
"additionalProperties": true,
|
|
"type": "object"
|
|
},
|
|
"placement": "optional",
|
|
"requiredClaims": [
|
|
"discovery:agents:read"
|
|
],
|
|
"schema": "paperclip.semantic-action.v1",
|
|
"title": "List company agents",
|
|
"version": 1
|
|
},
|
|
{
|
|
"allowedModes": [
|
|
"standard",
|
|
"ask",
|
|
"planning",
|
|
"skill_test"
|
|
],
|
|
"description": "Read one redacted actor profile in the run company.",
|
|
"effect": "read",
|
|
"inputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"actorId": {
|
|
"description": "Actor identifier.",
|
|
"maxLength": 200,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"actorId"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"operationId": "get_agent",
|
|
"outputSchema": {
|
|
"additionalProperties": true,
|
|
"type": "object"
|
|
},
|
|
"placement": "optional",
|
|
"requiredClaims": [
|
|
"discovery:agents:read"
|
|
],
|
|
"schema": "paperclip.semantic-action.v1",
|
|
"title": "Get company agent",
|
|
"version": 1
|
|
},
|
|
{
|
|
"allowedModes": [
|
|
"standard",
|
|
"ask",
|
|
"planning",
|
|
"skill_test"
|
|
],
|
|
"description": "Search tasks by text and status within the run company.",
|
|
"effect": "read",
|
|
"inputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"limit": {
|
|
"default": 50,
|
|
"maximum": 200,
|
|
"minimum": 1,
|
|
"type": "integer"
|
|
},
|
|
"query": {
|
|
"maxLength": 500,
|
|
"type": "string"
|
|
},
|
|
"statuses": {
|
|
"items": {
|
|
"enum": [
|
|
"backlog",
|
|
"todo",
|
|
"in_progress",
|
|
"in_review",
|
|
"done",
|
|
"blocked",
|
|
"cancelled"
|
|
]
|
|
},
|
|
"maxItems": 7,
|
|
"type": "array",
|
|
"uniqueItems": true
|
|
}
|
|
},
|
|
"required": [],
|
|
"type": "object"
|
|
},
|
|
"operationId": "search_tasks",
|
|
"outputSchema": {
|
|
"additionalProperties": true,
|
|
"type": "object"
|
|
},
|
|
"placement": "optional",
|
|
"requiredClaims": [
|
|
"discovery:tasks:read"
|
|
],
|
|
"schema": "paperclip.semantic-action.v1",
|
|
"title": "Search company tasks",
|
|
"version": 1
|
|
},
|
|
{
|
|
"allowedModes": [
|
|
"standard",
|
|
"ask",
|
|
"planning",
|
|
"skill_test"
|
|
],
|
|
"description": "List approvals in the run company.",
|
|
"effect": "governance",
|
|
"inputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {},
|
|
"required": [],
|
|
"type": "object"
|
|
},
|
|
"operationId": "list_approvals",
|
|
"outputSchema": {
|
|
"additionalProperties": true,
|
|
"type": "object"
|
|
},
|
|
"placement": "optional",
|
|
"requiredClaims": [
|
|
"governance:approvals:read"
|
|
],
|
|
"schema": "paperclip.semantic-action.v1",
|
|
"title": "List approvals",
|
|
"version": 1
|
|
},
|
|
{
|
|
"allowedModes": [
|
|
"standard",
|
|
"ask",
|
|
"planning",
|
|
"skill_test"
|
|
],
|
|
"description": "Read one approval without protected data.",
|
|
"effect": "governance",
|
|
"inputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"approvalId": {
|
|
"description": "Approval identifier.",
|
|
"maxLength": 200,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"approvalId"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"operationId": "get_approval",
|
|
"outputSchema": {
|
|
"additionalProperties": true,
|
|
"type": "object"
|
|
},
|
|
"placement": "optional",
|
|
"requiredClaims": [
|
|
"governance:approvals:read"
|
|
],
|
|
"schema": "paperclip.semantic-action.v1",
|
|
"title": "Get approval",
|
|
"version": 1
|
|
},
|
|
{
|
|
"allowedModes": [
|
|
"standard",
|
|
"ask",
|
|
"planning",
|
|
"skill_test"
|
|
],
|
|
"description": "Read one approval, its comments, and linked tasks.",
|
|
"effect": "governance",
|
|
"inputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"approvalId": {
|
|
"description": "Approval identifier.",
|
|
"maxLength": 200,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"approvalId"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"operationId": "get_approval_context",
|
|
"outputSchema": {
|
|
"additionalProperties": true,
|
|
"type": "object"
|
|
},
|
|
"placement": "optional",
|
|
"requiredClaims": [
|
|
"governance:approvals:read"
|
|
],
|
|
"schema": "paperclip.semantic-action.v1",
|
|
"title": "Get approval context",
|
|
"version": 1
|
|
},
|
|
{
|
|
"allowedModes": [
|
|
"standard",
|
|
"ask",
|
|
"planning",
|
|
"skill_test"
|
|
],
|
|
"description": "Read active-task workspace services.",
|
|
"effect": "read",
|
|
"inputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {},
|
|
"required": [],
|
|
"type": "object"
|
|
},
|
|
"operationId": "get_workspace_runtime",
|
|
"outputSchema": {
|
|
"additionalProperties": true,
|
|
"type": "object"
|
|
},
|
|
"placement": "optional",
|
|
"requiredClaims": [
|
|
"workspace:read"
|
|
],
|
|
"schema": "paperclip.semantic-action.v1",
|
|
"title": "Get workspace runtime",
|
|
"version": 1
|
|
},
|
|
{
|
|
"allowedModes": [
|
|
"standard",
|
|
"skill_test"
|
|
],
|
|
"description": "Start or stop one active-task workspace service.",
|
|
"effect": "write",
|
|
"inputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"action": {
|
|
"enum": [
|
|
"start",
|
|
"stop"
|
|
]
|
|
},
|
|
"idempotencyKey": {
|
|
"description": "Caller-stable retry key.",
|
|
"maxLength": 240,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"serviceId": {
|
|
"description": "Workspace service identifier.",
|
|
"maxLength": 200,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"idempotencyKey",
|
|
"serviceId",
|
|
"action"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"operationId": "control_workspace_service",
|
|
"outputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"commandId": {
|
|
"description": "Stable command identifier.",
|
|
"maxLength": 200,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"disposition": {
|
|
"enum": [
|
|
"applied",
|
|
"duplicate"
|
|
]
|
|
},
|
|
"entityRefs": {
|
|
"description": "Entities affected by the operation.",
|
|
"items": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"maxItems": 200,
|
|
"type": "array",
|
|
"uniqueItems": true
|
|
},
|
|
"scheduledWakeIds": {
|
|
"description": "Wake identifiers scheduled by the operation.",
|
|
"items": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"maxItems": 200,
|
|
"type": "array",
|
|
"uniqueItems": true
|
|
},
|
|
"stateRevision": {
|
|
"minimum": 0,
|
|
"type": "integer"
|
|
}
|
|
},
|
|
"required": [
|
|
"commandId",
|
|
"disposition",
|
|
"stateRevision",
|
|
"entityRefs",
|
|
"scheduledWakeIds"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"placement": "optional",
|
|
"requiredClaims": [
|
|
"workspace:control"
|
|
],
|
|
"schema": "paperclip.semantic-action.v1",
|
|
"title": "Control workspace service",
|
|
"version": 1
|
|
},
|
|
{
|
|
"allowedModes": [
|
|
"standard",
|
|
"skill_test"
|
|
],
|
|
"description": "Replace the active task's first-class blocker set.",
|
|
"effect": "write",
|
|
"inputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"blockedByTaskIds": {
|
|
"description": "Replacement blocker task identifiers.",
|
|
"items": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"maxItems": 200,
|
|
"type": "array",
|
|
"uniqueItems": true
|
|
},
|
|
"idempotencyKey": {
|
|
"description": "Caller-stable retry key.",
|
|
"maxLength": 240,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"idempotencyKey",
|
|
"blockedByTaskIds"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"operationId": "set_dependencies",
|
|
"outputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"commandId": {
|
|
"description": "Stable command identifier.",
|
|
"maxLength": 200,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"disposition": {
|
|
"enum": [
|
|
"applied",
|
|
"duplicate"
|
|
]
|
|
},
|
|
"entityRefs": {
|
|
"description": "Entities affected by the operation.",
|
|
"items": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"maxItems": 200,
|
|
"type": "array",
|
|
"uniqueItems": true
|
|
},
|
|
"scheduledWakeIds": {
|
|
"description": "Wake identifiers scheduled by the operation.",
|
|
"items": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"maxItems": 200,
|
|
"type": "array",
|
|
"uniqueItems": true
|
|
},
|
|
"stateRevision": {
|
|
"minimum": 0,
|
|
"type": "integer"
|
|
}
|
|
},
|
|
"required": [
|
|
"commandId",
|
|
"disposition",
|
|
"stateRevision",
|
|
"entityRefs",
|
|
"scheduledWakeIds"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"placement": "optional",
|
|
"requiredClaims": [
|
|
"dependencies:write"
|
|
],
|
|
"schema": "paperclip.semantic-action.v1",
|
|
"title": "Set task dependencies",
|
|
"version": 1
|
|
},
|
|
{
|
|
"allowedModes": [
|
|
"standard",
|
|
"ask",
|
|
"planning",
|
|
"skill_test"
|
|
],
|
|
"description": "Inspect available company projects before selecting a project for new work.",
|
|
"effect": "read",
|
|
"inputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {},
|
|
"required": [],
|
|
"type": "object"
|
|
},
|
|
"operationId": "list_projects",
|
|
"outputSchema": {
|
|
"additionalProperties": true,
|
|
"type": "object"
|
|
},
|
|
"placement": "optional",
|
|
"requiredClaims": [
|
|
"discovery:projects:read"
|
|
],
|
|
"schema": "paperclip.semantic-action.v1",
|
|
"title": "List projects",
|
|
"version": 1
|
|
},
|
|
{
|
|
"allowedModes": [
|
|
"standard",
|
|
"ask",
|
|
"planning",
|
|
"skill_test"
|
|
],
|
|
"description": "List authorized repositories with stable IDs and names. Consider appropriate repositories before creating a project; never invent IDs.",
|
|
"effect": "read",
|
|
"inputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {},
|
|
"required": [],
|
|
"type": "object"
|
|
},
|
|
"operationId": "list_project_repositories",
|
|
"outputSchema": {
|
|
"additionalProperties": true,
|
|
"type": "object"
|
|
},
|
|
"placement": "optional",
|
|
"requiredClaims": [],
|
|
"schema": "paperclip.semantic-action.v1",
|
|
"title": "List available repositories",
|
|
"version": 1
|
|
},
|
|
{
|
|
"allowedModes": [
|
|
"standard",
|
|
"skill_test"
|
|
],
|
|
"description": "Create a project after considering existing projects and available repositories. repositoryIds and repositoryUrls accept multiple existing repositories. Use HTTPS GitHub repositoryUrls when an accessible repo is not in the catalog; this registers project repositories, not remote GitHub repositories. Non-code projects may omit repositories. Cannot combine repositoryIds/repositoryUrls with workspace. Reuse the idempotency key on retries.",
|
|
"effect": "write",
|
|
"inputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"archivedAt": {
|
|
"description": "Archive timestamp.",
|
|
"maxLength": 20000,
|
|
"type": [
|
|
"string",
|
|
"null"
|
|
]
|
|
},
|
|
"color": {
|
|
"description": "Project color.",
|
|
"maxLength": 20000,
|
|
"type": [
|
|
"string",
|
|
"null"
|
|
]
|
|
},
|
|
"description": {
|
|
"description": "Project outcome and context.",
|
|
"maxLength": 20000,
|
|
"type": [
|
|
"string",
|
|
"null"
|
|
]
|
|
},
|
|
"env": {
|
|
"additionalProperties": true,
|
|
"type": "object"
|
|
},
|
|
"executionWorkspacePolicy": {
|
|
"additionalProperties": true,
|
|
"type": "object"
|
|
},
|
|
"goalId": {
|
|
"description": "Goal ID.",
|
|
"maxLength": 20000,
|
|
"type": [
|
|
"string",
|
|
"null"
|
|
]
|
|
},
|
|
"goalIds": {
|
|
"description": "Goal IDs.",
|
|
"items": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"maxItems": 200,
|
|
"type": "array",
|
|
"uniqueItems": true
|
|
},
|
|
"icon": {
|
|
"description": "Project icon.",
|
|
"maxLength": 20000,
|
|
"type": [
|
|
"string",
|
|
"null"
|
|
]
|
|
},
|
|
"idempotencyKey": {
|
|
"description": "Caller-stable retry key.",
|
|
"maxLength": 240,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"leadAgentId": {
|
|
"description": "Lead agent ID.",
|
|
"maxLength": 20000,
|
|
"type": [
|
|
"string",
|
|
"null"
|
|
]
|
|
},
|
|
"name": {
|
|
"description": "Project name.",
|
|
"maxLength": 500,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"repositoryIds": {
|
|
"description": "Authorized repository IDs from list_project_repositories; may contain multiple repositories.",
|
|
"items": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"maxItems": 200,
|
|
"type": "array",
|
|
"uniqueItems": true
|
|
},
|
|
"repositoryUrls": {
|
|
"description": "Existing HTTPS GitHub repository URLs, including repos absent from the catalog.",
|
|
"items": {
|
|
"maxLength": 2000,
|
|
"pattern": "^https://github\\.com/(?!\\.{1,2}/)[A-Za-z0-9_.-]+/(?!\\.{1,2}/?$)[A-Za-z0-9_.-]+/?$",
|
|
"type": "string"
|
|
},
|
|
"maxItems": 100,
|
|
"type": "array",
|
|
"uniqueItems": true
|
|
},
|
|
"status": {
|
|
"enum": [
|
|
"backlog",
|
|
"planned",
|
|
"in_progress",
|
|
"completed",
|
|
"cancelled"
|
|
]
|
|
},
|
|
"targetDate": {
|
|
"description": "Target date.",
|
|
"maxLength": 20000,
|
|
"type": [
|
|
"string",
|
|
"null"
|
|
]
|
|
},
|
|
"workspace": {
|
|
"additionalProperties": true,
|
|
"type": "object"
|
|
}
|
|
},
|
|
"required": [
|
|
"idempotencyKey",
|
|
"name"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"operationId": "create_project",
|
|
"outputSchema": {
|
|
"additionalProperties": true,
|
|
"type": "object"
|
|
},
|
|
"placement": "optional",
|
|
"requiredClaims": [],
|
|
"schema": "paperclip.semantic-action.v1",
|
|
"title": "Create project",
|
|
"version": 1
|
|
},
|
|
{
|
|
"allowedModes": [
|
|
"standard",
|
|
"skill_test"
|
|
],
|
|
"description": "Create an assigned task. In a conversation, create a project task with no parent; otherwise create a child of the active task. Include initialPlan to persist its plan before execution.",
|
|
"effect": "write",
|
|
"inputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"assigneeActorId": {
|
|
"description": "Optional actor assignee.",
|
|
"maxLength": 200,
|
|
"type": [
|
|
"string",
|
|
"null"
|
|
]
|
|
},
|
|
"blockedByTaskIds": {
|
|
"description": "Initial blocker task identifiers.",
|
|
"items": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"maxItems": 200,
|
|
"type": "array",
|
|
"uniqueItems": true
|
|
},
|
|
"description": {
|
|
"description": "Child task description.",
|
|
"maxLength": 20000,
|
|
"type": [
|
|
"string",
|
|
"null"
|
|
]
|
|
},
|
|
"idempotencyKey": {
|
|
"description": "Caller-stable retry key.",
|
|
"maxLength": 240,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"initialPlan": {
|
|
"description": "Relevant markdown plan to persist on the new task before it starts.",
|
|
"maxLength": 20000,
|
|
"type": [
|
|
"string",
|
|
"null"
|
|
]
|
|
},
|
|
"priority": {
|
|
"enum": [
|
|
"critical",
|
|
"high",
|
|
"medium",
|
|
"low"
|
|
]
|
|
},
|
|
"projectId": {
|
|
"description": "Project identifier for the new task.",
|
|
"maxLength": 20000,
|
|
"type": [
|
|
"string",
|
|
"null"
|
|
]
|
|
},
|
|
"title": {
|
|
"description": "Task title.",
|
|
"maxLength": 500,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"idempotencyKey",
|
|
"title"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"operationId": "create_task",
|
|
"outputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"commandId": {
|
|
"description": "Stable command identifier.",
|
|
"maxLength": 200,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"disposition": {
|
|
"enum": [
|
|
"applied",
|
|
"duplicate"
|
|
]
|
|
},
|
|
"entityRefs": {
|
|
"description": "Entities affected by the operation.",
|
|
"items": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"maxItems": 200,
|
|
"type": "array",
|
|
"uniqueItems": true
|
|
},
|
|
"scheduledWakeIds": {
|
|
"description": "Wake identifiers scheduled by the operation.",
|
|
"items": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"maxItems": 200,
|
|
"type": "array",
|
|
"uniqueItems": true
|
|
},
|
|
"stateRevision": {
|
|
"minimum": 0,
|
|
"type": "integer"
|
|
}
|
|
},
|
|
"required": [
|
|
"commandId",
|
|
"disposition",
|
|
"stateRevision",
|
|
"entityRefs",
|
|
"scheduledWakeIds"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"placement": "optional",
|
|
"requiredClaims": [
|
|
"delegation:tasks:create"
|
|
],
|
|
"schema": "paperclip.semantic-action.v1",
|
|
"title": "Create task",
|
|
"version": 1
|
|
},
|
|
{
|
|
"allowedModes": [
|
|
"standard",
|
|
"skill_test"
|
|
],
|
|
"description": "Create a governed approval and waiting posture.",
|
|
"effect": "governance",
|
|
"inputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"approvalType": {
|
|
"description": "Stable approval type.",
|
|
"maxLength": 200,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"idempotencyKey": {
|
|
"description": "Caller-stable retry key.",
|
|
"maxLength": 240,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"payload": {
|
|
"additionalProperties": true,
|
|
"type": "object"
|
|
}
|
|
},
|
|
"required": [
|
|
"idempotencyKey",
|
|
"approvalType",
|
|
"payload"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"operationId": "request_approval",
|
|
"outputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"commandId": {
|
|
"description": "Stable command identifier.",
|
|
"maxLength": 200,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"disposition": {
|
|
"enum": [
|
|
"applied",
|
|
"duplicate"
|
|
]
|
|
},
|
|
"entityRefs": {
|
|
"description": "Entities affected by the operation.",
|
|
"items": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"maxItems": 200,
|
|
"type": "array",
|
|
"uniqueItems": true
|
|
},
|
|
"scheduledWakeIds": {
|
|
"description": "Wake identifiers scheduled by the operation.",
|
|
"items": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"maxItems": 200,
|
|
"type": "array",
|
|
"uniqueItems": true
|
|
},
|
|
"stateRevision": {
|
|
"minimum": 0,
|
|
"type": "integer"
|
|
}
|
|
},
|
|
"required": [
|
|
"commandId",
|
|
"disposition",
|
|
"stateRevision",
|
|
"entityRefs",
|
|
"scheduledWakeIds"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"placement": "optional",
|
|
"requiredClaims": [
|
|
"governance:approvals:request"
|
|
],
|
|
"schema": "paperclip.semantic-action.v1",
|
|
"title": "Request approval",
|
|
"version": 1
|
|
},
|
|
{
|
|
"allowedModes": [
|
|
"standard",
|
|
"skill_test"
|
|
],
|
|
"allowedRoles": [
|
|
"board",
|
|
"approver",
|
|
"security"
|
|
],
|
|
"description": "Decide an approval as an explicitly authorized approver.",
|
|
"effect": "governance",
|
|
"inputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"approvalId": {
|
|
"description": "Approval identifier.",
|
|
"maxLength": 200,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"decision": {
|
|
"enum": [
|
|
"approved",
|
|
"rejected",
|
|
"cancelled"
|
|
]
|
|
},
|
|
"idempotencyKey": {
|
|
"description": "Caller-stable retry key.",
|
|
"maxLength": 240,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"note": {
|
|
"description": "Decision note.",
|
|
"maxLength": 20000,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"idempotencyKey",
|
|
"approvalId",
|
|
"decision",
|
|
"note"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"operationId": "decide_approval",
|
|
"outputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"commandId": {
|
|
"description": "Stable command identifier.",
|
|
"maxLength": 200,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"disposition": {
|
|
"enum": [
|
|
"applied",
|
|
"duplicate"
|
|
]
|
|
},
|
|
"entityRefs": {
|
|
"description": "Entities affected by the operation.",
|
|
"items": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"maxItems": 200,
|
|
"type": "array",
|
|
"uniqueItems": true
|
|
},
|
|
"scheduledWakeIds": {
|
|
"description": "Wake identifiers scheduled by the operation.",
|
|
"items": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"maxItems": 200,
|
|
"type": "array",
|
|
"uniqueItems": true
|
|
},
|
|
"stateRevision": {
|
|
"minimum": 0,
|
|
"type": "integer"
|
|
}
|
|
},
|
|
"required": [
|
|
"commandId",
|
|
"disposition",
|
|
"stateRevision",
|
|
"entityRefs",
|
|
"scheduledWakeIds"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"placement": "optional",
|
|
"requiredClaims": [
|
|
"governance:approvals:decide"
|
|
],
|
|
"schema": "paperclip.semantic-action.v1",
|
|
"title": "Decide approval",
|
|
"version": 1
|
|
},
|
|
{
|
|
"allowedModes": [
|
|
"standard",
|
|
"ask",
|
|
"planning",
|
|
"skill_test"
|
|
],
|
|
"description": "Add a durable comment to an approval.",
|
|
"effect": "governance",
|
|
"inputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"approvalId": {
|
|
"description": "Approval identifier.",
|
|
"maxLength": 200,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"body": {
|
|
"description": "Approval comment.",
|
|
"maxLength": 20000,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"idempotencyKey": {
|
|
"description": "Caller-stable retry key.",
|
|
"maxLength": 240,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"idempotencyKey",
|
|
"approvalId",
|
|
"body"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"operationId": "comment_on_approval",
|
|
"outputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"commandId": {
|
|
"description": "Stable command identifier.",
|
|
"maxLength": 200,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"disposition": {
|
|
"enum": [
|
|
"applied",
|
|
"duplicate"
|
|
]
|
|
},
|
|
"entityRefs": {
|
|
"description": "Entities affected by the operation.",
|
|
"items": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"maxItems": 200,
|
|
"type": "array",
|
|
"uniqueItems": true
|
|
},
|
|
"scheduledWakeIds": {
|
|
"description": "Wake identifiers scheduled by the operation.",
|
|
"items": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"maxItems": 200,
|
|
"type": "array",
|
|
"uniqueItems": true
|
|
},
|
|
"stateRevision": {
|
|
"minimum": 0,
|
|
"type": "integer"
|
|
}
|
|
},
|
|
"required": [
|
|
"commandId",
|
|
"disposition",
|
|
"stateRevision",
|
|
"entityRefs",
|
|
"scheduledWakeIds"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"placement": "optional",
|
|
"requiredClaims": [
|
|
"governance:approvals:comment"
|
|
],
|
|
"schema": "paperclip.semantic-action.v1",
|
|
"title": "Comment on approval",
|
|
"version": 1
|
|
},
|
|
{
|
|
"allowedModes": [
|
|
"standard",
|
|
"skill_test"
|
|
],
|
|
"description": "Schedule a bounded continuation wake.",
|
|
"effect": "write",
|
|
"inputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"delaySeconds": {
|
|
"maximum": 86400,
|
|
"minimum": 1,
|
|
"type": "integer"
|
|
},
|
|
"idempotencyKey": {
|
|
"description": "Caller-stable retry key.",
|
|
"maxLength": 240,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"payload": {
|
|
"additionalProperties": true,
|
|
"type": "object"
|
|
},
|
|
"reason": {
|
|
"enum": [
|
|
"manual",
|
|
"issue_commented",
|
|
"interaction_resolved",
|
|
"approval_resolved",
|
|
"blockers_resolved",
|
|
"scheduled_retry",
|
|
"resume"
|
|
]
|
|
}
|
|
},
|
|
"required": [
|
|
"idempotencyKey",
|
|
"reason",
|
|
"delaySeconds"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"operationId": "schedule_wake",
|
|
"outputSchema": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"commandId": {
|
|
"description": "Stable command identifier.",
|
|
"maxLength": 200,
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"disposition": {
|
|
"enum": [
|
|
"applied",
|
|
"duplicate"
|
|
]
|
|
},
|
|
"entityRefs": {
|
|
"description": "Entities affected by the operation.",
|
|
"items": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"maxItems": 200,
|
|
"type": "array",
|
|
"uniqueItems": true
|
|
},
|
|
"scheduledWakeIds": {
|
|
"description": "Wake identifiers scheduled by the operation.",
|
|
"items": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"maxItems": 200,
|
|
"type": "array",
|
|
"uniqueItems": true
|
|
},
|
|
"stateRevision": {
|
|
"minimum": 0,
|
|
"type": "integer"
|
|
}
|
|
},
|
|
"required": [
|
|
"commandId",
|
|
"disposition",
|
|
"stateRevision",
|
|
"entityRefs",
|
|
"scheduledWakeIds"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"placement": "optional",
|
|
"requiredClaims": [
|
|
"control_plane:wakes"
|
|
],
|
|
"schema": "paperclip.semantic-action.v1",
|
|
"title": "Schedule bounded wake",
|
|
"version": 1
|
|
}
|
|
]
|