
Portable AI memory you own. Keep memories and notes across Claude, ChatGPT, and other AI tools.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Move to Trash. Project: projectId + expectedRevision + operationId; penny_edit op:restore recovers. Repeat in_progress with the same operationId; report partial_recovery conflicts. Note/tracker_entry: ids (max100); skill/rhythm: one id; profile_block: ids are block names. Tag/link removal uses the identifiers below. Tasks are canceled via penny_edit; tracker definitions are archived, not deleted.
What to trash.
note/tracker_entry: IDs to trash, max 100. rhythm/skill: exactly one ID. profile_block: block names to trash.
tag_relation: required edge endpoint to remove.
tag_relation: required other endpoint.
Profile block scope; Project private overrides defaults, workspace requires workspaceId.
tracker_note_link: required note IDs to unlink.
tracker_note_link: required entry to detach notes from.
The server marks this tool as destructive. Running it may delete or overwrite data on the server or in any account you connected with your headers.
Move to Trash. Project: projectId + expectedRevision + operationId; penny_edit op:restore recovers. Repeat in_progress with the same operationId; report partial_recovery conflicts. Note/tracker_entry: ids (max100); skill/rhythm: one id; profile_block: ids are block names. Tag/link removal uses the identifiers below. Tasks are canceled via penny_edit; tracker definitions are archived, not deleted.
| Argument | Type | Description |
|---|---|---|
| ids | array | note/tracker_entry: IDs to trash, max 100. rhythm/skill: exactly one ID. profile_block: block names to trash. |
| tagA | string | tag_relation: required edge endpoint to remove. |
| tagB | string | tag_relation: required other endpoint. |
| scope | string | Profile block scope; Project private overrides defaults, workspace requires workspaceId. |
| noteIds | array | tracker_note_link: required note IDs to unlink. |
| projectId | string | |
| entityType* | string | What to trash. |
| operationId | string | |
| trackerEntryId | string | tracker_note_link: required entry to detach notes from. |
| expectedRevision | number |
{
"type": "object",
"required": [
"entityType"
],
"properties": {
"ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "note/tracker_entry: IDs to trash, max 100. rhythm/skill: exactly one ID. profile_block: block names to trash."
},
"tagA": {
"type": "string",
"description": "tag_relation: required edge endpoint to remove."
},
"tagB": {
"type": "string",
"description": "tag_relation: required other endpoint."
},
"scope": {
"enum": [
"global",
"workspace",
"private"
],
"type": "string",
"description": "Profile block scope; Project private overrides defaults, workspace requires workspaceId."
},
"noteIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "tracker_note_link: required note IDs to unlink."
},
"projectId": {
"type": "string"
},
"entityType": {
"enum": [
"project",
"note",
"tracker_entry",
"rhythm",
"skill",
"profile_block",
"tag_relation",
"tracker_note_link"
],
"type": "string",
"description": "What to trash."
},
"operationId": {
"type": "string"
},
"trackerEntryId": {
"type": "string",
"description": "tracker_note_link: required entry to detach notes from."
},
"expectedRevision": {
"type": "number"
}
}
}When the user corrects something on file, or a task, tracker, skill, or block needs to change, edit the existing item rather than writing a duplicate. Modify what already exists; entityType uses the same taxonomy as penny_write (see ladder). Notes: updates[] patch/replace, max100. Tasks: taskId; cancel via status:canceled, never Trash. Profile: blockName + content upsert; memory_policy and persona hold standing instructions. When the user tells you what to save, skip, check, or surface, update their memory_policy block in the same turn as a general rule in their words. Skill redefinition prepares a preview, not a save; wait for user approval before op:apply with proposalId. cancel discards; undo recovers the prior version if no later edit exists. skills/history supplies historyId; restore_revision with skillId/historyId/expectedUpdatedAt previews recovery. restore with skillId recovers deleted skills disabled. No invocation waiting period. Trackers: trackerId + sparse name/description/unit/kind/targetSpec/archived; retire by archiving, no delete. Private trackers only; workspace trackers unsupported. Rhythms: full manifest. skill_run/rhythm_run: complete runId + status. Projects: projectId + expectedRevision + operationId + sparse patch; reread and reconcile on conflict. restore_revision restores fields/resourceIds from historyId as a new revision. Tracker entries: trackerId + entryId + expectedUpdatedAt + full payload. restore un-trashes note/tracker_entry ids or Project projectId.
| Argument | Type | Description |
|---|---|---|
| op | string | restore: un-trash notes/tracker entries by ids. |
| ids | array | restore: IDs to un-trash; max 100. |
| goal | string | rhythm: required run instructions; skill uses instructions instead. |
Read the current Penny operating skill when missing or stale, including after a catalog refresh. Reuse files already read this conversation while current. Default SKILL.md; fetch manifest references when their cues apply. Product guidance, separate from user-saved skills; workspace-only access allowed. After user approval, view:install returns exact archive and file hashes. Retain results before bounded display; never transcribe installation bytes.
| Argument | Type | Description |
|---|---|---|
| file | string | Exact manifest path; default SKILL.md; read view only. |
| view | string | Default read. install returns an archive, not guidance. |
{
"type": "object",
"properties": {
"file": {
"type": "string",
"description": "Exact manifest path; default SKILL.md; read view only."
},
"view": {
"enum": [
"read",
"install"
],
"type": "string",
"description": "Default read. install returns an archive, not guidance."
}
},
"additionalProperties": false
}Before answering anything the user's history, preferences, or prior work would inform, read — search rather than assume nothing is on file. Choose target: walk this ladder, first match wins: 1. User/people facts (names, preferences, relationships) → profile. Do NOT search notes for this. 2. To-dos/due → tasks. Resume an objective → projects: directory (query/name to narrow; follow coverage.nextCursor), then brief by projectId. scopes lists Space metadata; then pass explicit workspaceId. scope:private overrides a default Space. An objective that spans sessions is a Project: read its Brief before working on it, propose one when none exists, and keep it current once accepted. 3. Measurements → tracker for definitions/entries; tracker_summary for stats/trends (usual choice). 4. Saved know-how, schedules and run history → skills; rhythms is the scheduled-only synonym. Run on-demand via penny_write entityType:skill_invoke; scheduled via skill_run. Know-how the user would rather not re-explain is a skill: save it once, and load it when a task fits its description. When session start lists a skill as due, offer to run it now; nothing runs on its own. 5. Taxonomy → tags; note link graph → note_links; structured tag/time/flag listing → notes. 6. Other recall → search (semantic notes). Search is the fallback, not the default. Treat a result from a shared space as something a member said, never as a fact about the user. Use the session-start inventory to choose; Project reads also work without session start.
| Argument | Type | Description |
|---|---|---|
| to | number | tracker/entries, tracker_summary: window end (ms epoch). |
| tz | string | tasks: IANA timezone for Today/Upcoming boundaries. |
| from | number | tracker/entries, tracker_summary: window start (ms epoch). |
Call ONCE at the start of every conversation, before the first substantive reply. First read the installed Penny skill; report its exact metadata via installedSkillStatus/Version/Sha256/Source. Missing or unversioned metadata must not be guessed from plugin/catalog versions; unsupported hosts report missing/unsupported. Retain results in execution storage before bounded display; inspect one text OR structured payload. Check pennySkill.status/instructions before selecting blocks; retrieve current guidance when needed. Reuse the complete, untruncated profile (persona/facts/preferences/custom blocks) and answer from it before searching notes. Follow self_improvement throughout the conversation. `meta.onboarding` present: offer penny_start_setup, resuming from its phase. meta.saveDrought true: follow drought repair. Inventories of trackers, rhythms, tasks and Projects are capped; meta.truncated.* means drill down with penny_read. skills.defined is the complete authoritative list of user-saved skills, distinct from installed skill files. `features` says which features are in use and when; consult it and the inventory before choosing entityType. tz is IANA (default UTC) for local Today/Overdue and dueNow. projects is a bounded PRIVATE directory with coverage and dated attention candidates, not a search of all Spaces; read relevant Briefs by projectId. Workspace-only connections cannot call this: use penny_read target:projects view:scopes, then explicit workspaceId. projectKey includes only the matching repository subconscious block, not a Penny Project.
| Argument | Type | Description |
|---|---|---|
| tz | string | IANA timezone for today/overdue boundaries (e.g. America/New_York); default UTC. |
| projectKey | string | Include subconscious:<projectKey>; exclude all other subconscious blocks. |
| installedSkillSha256 |
Setup in phases; omit phase to start, resume from meta.onboarding.phase. skipForGood opts out. Stage encrypted imports for dashboard review; status checks receipts. Only users save/cancel there. Imported counts are server-derived; finish cannot complete an active import.
| Argument | Type | Description |
|---|---|---|
| stop | integer | Tour stop, with phase tour. |
| phase | string | Phase to run; omit to start. |
| client | string | Actual host: claude-desktop, claude-code, codex, chatgpt or other; tailors paste guidance. |
| counts | object | Cumulative answers/featuresCreated. Ledger imports ignore imported; only committed receipts count. |
| draftId | string | Returned collection ID; stage only. |
| importDraft | string | Strict JSON {notes,profiles}; returned schema. 10 notes, 4 replacements, 64 KiB UTF-8. No approval/source/selection. |
| skipForGood | boolean | User requested permanent setup opt-out. |
| importAction | string | Stage needs importDraft, draftId, expectedRevision. Status has no content. No model approval. |
| prevAccepted |
Save the moment something durable emerges — a decision, preference, plan, correction, a to-do, a measurement, or something you produced — mid-conversation and unprompted; when the call is close, save. Choose entityType: walk this ladder, first match wins: 1. Durable fact about the user or their people → update the profile (profile upsert or penny_edit), not a note. How they want to be remembered → memory_policy, a general rule in their words; how they want you to show up (tone/register/manner) → persona. When the user tells you what to save, skip, check, or surface, update their memory_policy block in the same turn as a general rule in their words. 2. Commitment/action with a done-state → task. Organize via area/project/heading. A to-do the user mentions, even in passing, is a task: offer to capture it, then write it. Project create: patch.name/purpose + operationId; revise: projectId + expectedRevision from Brief + sparse patch (max 25 step/resource changes). project_interaction records actor proposals/declines/deferrals. pending_share_approval is a proposal, not a save. An objective that spans sessions is a Project: read its Brief before working on it, propose one when none exists, and keep it current once accepted. 3. Measurement → tracker_entry for an existing tracker (check inventory); otherwise propose tracker first. Active duplicate tracker names are rejected; edit with penny_edit. A measurement the user would log more than once is a tracker entry; if no tracker fits, propose one before logging. 4. Reusable know-how → skill; trigger makes it scheduled (legacy rhythm). Existing skill names prepare a preview; wait for user approval before penny_edit op:apply with proposalId. Run on-demand via skill_invoke; begin scheduled runs via skill_run. Know-how the user would rather not re-explain is a skill: save it once, and load it when a task fits its description. 5. Other context/events/ideas/learning → note. Prefer a specific type when unsure; a note is the fallback, not the default. Also tag_relation and tracker_note_link. Batch notes or tracker_entry entries: max100. Modify existing items with penny_edit; trash with penny_delete. Reuse an existing tag before minting a new one. Tagging and linking conventions live in the Penny skill. Note confidence measures signal, not pipeline: 0.95 = explicit user statement; 0.80 = confirmed decision; 0.60 = reasonable inference; 0.40 = hedged or sleeptime-derived; 0.20 = weak signal. Each note needs sampleQuestions: exactly three short, distinct natural-language questions derived from its content, in the user's voice, not keywords or near-duplicates. For an APA preference: ["What citation style should I use for the paper?", "How should I format references in my thesis?", "What’s my usual academic style?"].
| kind |
| string |
| tracker: habit|metric|goal|log|status|custom. |
| name | string | area/project/tracker: name. entityType:"skill": previews replacement; rhythm: upserts. |
| unit | string | tracker: unit of measure. |
| actor | string | task/area/project/heading: actor (me|agent) recorded in activity ledger. |
| notes | string | task/area/project: markdown body. |
| order | number | task/area/project/heading: sort order. |
| orgId | string | area/project/heading: required container ID to update. |
| owner | string | task: assignee. |
| patch | object | Project patch: full schema on penny_write. |
| runId | string | skill_run/rhythm_run: required run ID to complete. |
| scope | string | Profile: global|workspace. Projects: private; workspace requires workspaceId. |
| title | string | task/heading: title/label. |
| areaId | string | project: parent area. |
| fields | array | Restore selection: field names or step:<stepId>; fields/resourceIds required. |
| status | string | task: open|in_progress|done|canceled. Repeating completion returns nextTaskId: act on that new occurrence; the completed ID rejects further status writes. skill_run/rhythm_run: done|error|skipped. |
| taskId | string | task: required ID to update. |
| whenAt | number | task/project: schedule date (ms epoch). |
| content | string | profile: required new block content. |
| deliver | object | entityType:"skill": required with trigger; rhythm: required. Omit for on-demand. Shape: penny_write. |
| enabled | boolean | skill: false pauses due signals, true resumes; requires skillId. Penny does not run skills. |
| entryId | string |
| payload | object | string |
| posture | string | entityType:"skill" with trigger, or rhythm: read|propose|act. |
| skillId | string | skill: ID required with enabled to pause/resume. |
| trigger | object | entityType:"skill": optional; rhythm: required. Omit to return to on-demand. Penny does not run it; connected agents receive due signals. Shape: penny_write. ALWAYS set IANA timezone; default UTC. |
| updates | array | note: patch or supersede up to 100 existing notes. |
| archived | boolean | Area/project/tracker: archive; false reactivates. Tracker definitions retire only this way. |
| deadline | number | task/project: hard due date (ms epoch). |
| snapshot | string | skill restore_revision: history side; default before. after recovers an undone change. |
| agentNote | string |
| blockName | string | profile: required block to upsert. |
| dependsOn | array | task: full prerequisite taskId set; replaces all. |
| historyId | string | restore_revision: Project/skill history ID. Skill restore previews; requires skillId and expectedUpdatedAt. |
| linkNotes | array | task: note IDs to link. |
| projectId | string | heading: required parent Project. |
| trackerId | string | tracker: required ID to update; only supplied fields change. |
| entityType* | string | Item type. |
| proposalId | string | Returned skill proposal. apply commits after user review; cancel discards; undo restores the previous version only if no later edit exists. |
| provenance | object | rhythm_run: accountability summary (IDs/labels, never full content). |
| recordedAt | number |
| recurrence | object | task: set/change recurrence. clearFields:["recurrence"] ends the series, making the task one-off and preserving completed history. Target currentOccurrenceId, not a stale/completed ID. |
| targetSpec | object | tracker: replaces the whole target spec; shape as penny_write. |
| whenBucket | string | task/project: undated bucket; mutually exclusive with whenAt. |
| clearFields | array | task: optional fields to unset. |
| description | string | entityType:"skill"/rhythm: required use-when description. tracker: meaning; log trackers must document payload shape. |
| operationId | string | Project receipt key; identical retries only. |
| resourceIds | array | Restore selected links. |
| instructions | string | skill: required saved know-how; replaces rhythm goal. |
| retrievalPlan | array | entityType:"skill"/rhythm: optional deterministic steps for a bounded tier. |
| expectedRevision | number | Project revision from Brief; reconcile conflicts. |
| expectedUpdatedAt | number | Source version from read. |
{
"type": "object",
"required": [
"entityType"
],
"properties": {
"op": {
"enum": [
"restore",
"restore_revision",
"apply",
"cancel",
"undo"
],
"type": "string",
"description": "restore: un-trash notes/tracker entries by ids."
},
"ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "restore: IDs to un-trash; max 100."
},
"goal": {
"type": "string",
"description": "rhythm: required run instructions; skill uses instructions instead."
},
"kind": {
"type": "string",
"description": "tracker: habit|metric|goal|log|status|custom."
},
"name": {
"type": "string",
"description": "area/project/tracker: name. entityType:\"skill\": previews replacement; rhythm: upserts."
},
"unit": {
"type": "string",
"description": "tracker: unit of measure."
},
"actor": {
"type": "string",
"description": "task/area/project/heading: actor (me|agent) recorded in activity ledger."
},
"notes": {
"type": "string",
"description": "task/area/project: markdown body."
},
"order": {
"type": "number",
"description": "task/area/project/heading: sort order."
},
"orgId": {
"type": "string",
"description": "area/project/heading: required container ID to update."
},
"owner": {
"enum": [
"me",
"agent",
"unassigned"
],
"type": "string",
"description": "task: assignee."
},
"patch": {
"type": "object",
"description": "Project patch: full schema on penny_write."
},
"runId": {
"type": "string",
"description": "skill_run/rhythm_run: required run ID to complete."
},
"scope": {
"enum": [
"global",
"workspace",
"private"
],
"type": "string",
"description": "Profile: global|workspace. Projects: private; workspace requires workspaceId."
},
"title": {
"type": "string",
"description": "task/heading: title/label."
},
"areaId": {
"type": "string",
"description": "project: parent area."
},
"fields": {
"type": "array",
"items": {
"type": "string"
},
"description": "Restore selection: field names or step:<stepId>; fields/resourceIds required."
},
"status": {
"type": "string",
"description": "task: open|in_progress|done|canceled. Repeating completion returns nextTaskId: act on that new occurrence; the completed ID rejects further status writes. skill_run/rhythm_run: done|error|skipped."
},
"taskId": {
"type": "string",
"description": "task: required ID to update."
},
"whenAt": {
"type": "number",
"description": "task/project: schedule date (ms epoch)."
},
"content": {
"type": "string",
"description": "profile: required new block content."
},
"deliver": {
"type": "object",
"description": "entityType:\"skill\": required with trigger; rhythm: required. Omit for on-demand. Shape: penny_write."
},
"enabled": {
"type": "boolean",
"description": "skill: false pauses due signals, true resumes; requires skillId. Penny does not run skills."
},
"entryId": {
"type": "string"
},
"payload": {
"type": [
"object",
"string"
]
},
"posture": {
"type": "string",
"description": "entityType:\"skill\" with trigger, or rhythm: read|propose|act."
},
"skillId": {
"type": "string",
"description": "skill: ID required with enabled to pause/resume."
},
"trigger": {
"type": "object",
"description": "entityType:\"skill\": optional; rhythm: required. Omit to return to on-demand. Penny does not run it; connected agents receive due signals. Shape: penny_write. ALWAYS set IANA timezone; default UTC."
},
"updates": {
"type": "array",
"items": {
"type": "object",
"required": [
"memoryId",
"mode"
],
"properties": {
"mode": {
"enum": [
"patch",
"replace"
],
"type": "string"
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
},
"content": {
"type": "string",
"description": "Required for patch."
},
"memoryId": {
"type": "string"
},
"supersededBy": {
"type": "string",
"description": "replace: required replacement note ID."
},
"expectedUpdatedAt": {
"type": "number"
}
}
},
"maxItems": 100,
"description": "note: patch or supersede up to 100 existing notes."
},
"archived": {
"type": "boolean",
"description": "Area/project/tracker: archive; false reactivates. Tracker definitions retire only this way."
},
"deadline": {
"type": "number",
"description": "task/project: hard due date (ms epoch)."
},
"snapshot": {
"enum": [
"before",
"after"
],
"type": "string",
"description": "skill restore_revision: history side; default before. after recovers an undone change."
},
"agentNote": {
"type": "string"
},
"blockName": {
"type": "string",
"description": "profile: required block to upsert."
},
"dependsOn": {
"type": "array",
"items": {
"type": "string"
},
"description": "task: full prerequisite taskId set; replaces all."
},
"historyId": {
"type": "string",
"description": "restore_revision: Project/skill history ID. Skill restore previews; requires skillId and expectedUpdatedAt."
},
"linkNotes": {
"type": "array",
"items": {
"type": "string"
},
"description": "task: note IDs to link."
},
"projectId": {
"type": "string",
"description": "heading: required parent Project."
},
"trackerId": {
"type": "string",
"description": "tracker: required ID to update; only supplied fields change."
},
"entityType": {
"enum": [
"profile",
"task",
"area",
"project",
"heading",
"tracker",
"rhythm",
"rhythm_run",
"skill",
"skill_run",
"note",
"tracker_entry"
],
"type": "string",
"description": "Item type."
},
"proposalId": {
"type": "string",
"description": "Returned skill proposal. apply commits after user review; cancel discards; undo restores the previous version only if no later edit exists."
},
"provenance": {
"type": "object",
"properties": {
"reads": {
"type": "array",
"items": {
"type": "string"
}
},
"writes": {
"type": "array",
"items": {
"type": "string"
}
},
"summary": {
"type": "string"
},
"delivered": {
"type": "string"
},
"outsideWorld": {
"type": "array",
"items": {
"type": "string"
}
}
},
"description": "rhythm_run: accountability summary (IDs/labels, never full content)."
},
"recordedAt": {
"type": "number"
},
"recurrence": {
"type": "object",
"required": [
"cadence"
],
"properties": {
"at": {
"type": "string",
"description": "task: set/change recurrence; shape as penny_write. clearFields:[\"recurrence\"] ends the series, preserving history; target currentOccurrenceId."
},
"cadence": {
"enum": [
"daily",
"weekly",
"monthly"
],
"type": "string"
},
"timezone": {
"type": "string",
"description": "IANA timezone (e.g. America/New_York)."
}
},
"description": "task: set/change recurrence. clearFields:[\"recurrence\"] ends the series, making the task one-off and preserving completed history. Target currentOccurrenceId, not a stale/completed ID."
},
"targetSpec": {
"type": "object",
"description": "tracker: replaces the whole target spec; shape as penny_write."
},
"whenBucket": {
"enum": [
"anytime",
"someday"
],
"type": "string",
"description": "task/project: undated bucket; mutually exclusive with whenAt."
},
"clearFields": {
"type": "array",
"items": {
"enum": [
"whenAt",
"whenBucket",
"deadline",
"projectId",
"headingId",
"recurrence"
],
"type": "string"
},
"description": "task: optional fields to unset."
},
"description": {
"type": "string",
"description": "entityType:\"skill\"/rhythm: required use-when description. tracker: meaning; log trackers must document payload shape."
},
"operationId": {
"type": "string",
"description": "Project receipt key; identical retries only."
},
"resourceIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Restore selected links."
},
"instructions": {
"type": "string",
"description": "skill: required saved know-how; replaces rhythm goal."
},
"retrievalPlan": {
"type": "array",
"description": "entityType:\"skill\"/rhythm: optional deterministic steps for a bounded tier."
},
"expectedRevision": {
"type": "number",
"description": "Project revision from Brief; reconcile conflicts."
},
"expectedUpdatedAt": {
"type": "number",
"description": "Source version from read."
}
}
}| name | string | Projects directory: exact-name candidates; continue incomplete coverage. skills/one: name instead of skillId. |
| tags | array | search/notes: tag filter. |
| view | string | Projects: directory (default), brief, section, resources, resource, history, scopes (Space metadata), attention (dated candidates), interactions (actor only). tracker: list|entries; rhythms: list|one|due|runs; skills: list|one|due|runs|history|trash (list/trash omit instructions; one returns full skill by skillId or name); tags: list|related; tasks: compact omits notes. |
| depth | number | note_links: hops (1 = direct; 2-6 = bounded BFS). |
| flags | object | notes: locked/pinned filter. |
| limit | number | Max search/notes/tracker-entry/task/rhythm-run results. tasks: page size; long pages end early with nextCursor. |
| owner | string | tasks: owner filter. |
| query | string | search: required semantic query. projects directory: name/purpose filter; check coverage. |
| scope | string | Projects: private overrides defaults; workspace requires workspaceId. |
| areaId | string | tasks: area filter; also applies to organize:project. |
| bucket | string | tasks: schedule bucket filter. |
| cursor | string | projects/tasks: prior nextCursor; keep the same filters. tasks: a page can be short and still have one; read until a reply has none. |
| status | string | tasks: status filter. |
| target* | string | What to read; first match in the tool description's ladder wins. |
| taskId | string | tasks: full detail. A repeating task returns seriesId/currentOccurrenceId; act on the current occurrence, not a completed ID. |
| blocked | boolean | tasks: only tasks with unmet dependsOn. |
| section | string | projects/section: one Brief section. |
| seedIds | array | note_links: required starting note IDs. |
| skillId | string | skills: required for one unless name is given; optional run scope for runs. |
| dateAxis | string | notes: timeRange axis; created = when written, valid = when the fact holds. |
| dueRange | object | tasks: due-date window (ms epoch). |
| eventKey | string | Projects interactions: actor event key; omit to page. |
| maxDepth | number | tags/related: maximum traversal depth. |
| maxNodes | number | note_links: node cap for depth > 1; default 50. |
| organize | string | tasks: list containers instead of tasks. |
| rhythmId | string | rhythms: required for one; optional run scope for runs. |
| seriesId | string | tasks: complete recurring-series history, newest first, including completed occurrences. |
| edgeTypes | array | note_links: only follow/return these relationship types. |
| minWeight | number | tags/related: minimum edge weight (default 0.4). |
| orgStatus | string | tasks organize:project: Project status filter. |
| projectId | string | projects brief/section/resources/resource/history: required stable Project ID. tasks: Project filter or heading parent. |
| timeRange | object | search/notes: time window (ms epoch). |
| trackerId | string | Required for tracker/entries and tracker_summary. |
| blockNames | array | profile: exact block names. |
| confidence | object | notes: confidence range. |
| ifRevision | string | profile: last-read revision; returns {unchanged:true} if unchanged. |
| projectKey | string | profile: include subconscious:<projectKey>. |
| resourceId | string | Projects resource: read the authorized current source. |
| enabledOnly | boolean | rhythms/list: only enabled rhythms. |
| resourceState | string |
| graphTraversal | boolean | search: opt into tag/link graph expansion (default false; measured recall loss). Use only for deliberate graph exploration. |
| includeArchived | boolean | Include archived trackers, Projects, or task containers. |
| includeCompleted | boolean | tasks: include done/canceled; default false. An explicit status wins. |
| includeRelations | boolean | tags/list: include parents/children/synonyms. |
{
"type": "object",
"required": [
"target"
],
"properties": {
"to": {
"type": "number",
"description": "tracker/entries, tracker_summary: window end (ms epoch)."
},
"tz": {
"type": "string",
"description": "tasks: IANA timezone for Today/Upcoming boundaries."
},
"from": {
"type": "number",
"description": "tracker/entries, tracker_summary: window start (ms epoch)."
},
"name": {
"type": "string",
"description": "Projects directory: exact-name candidates; continue incomplete coverage. skills/one: name instead of skillId."
},
"tags": {
"type": "array",
"items": {
"type": "string"
},
"description": "search/notes: tag filter."
},
"view": {
"type": "string",
"description": "Projects: directory (default), brief, section, resources, resource, history, scopes (Space metadata), attention (dated candidates), interactions (actor only). tracker: list|entries; rhythms: list|one|due|runs; skills: list|one|due|runs|history|trash (list/trash omit instructions; one returns full skill by skillId or name); tags: list|related; tasks: compact omits notes."
},
"depth": {
"type": "number",
"description": "note_links: hops (1 = direct; 2-6 = bounded BFS)."
},
"flags": {
"type": "object",
"properties": {
"locked": {
"type": "boolean"
},
"pinned": {
"type": "boolean"
}
},
"description": "notes: locked/pinned filter."
},
"limit": {
"type": "number",
"description": "Max search/notes/tracker-entry/task/rhythm-run results. tasks: page size; long pages end early with nextCursor."
},
"owner": {
"enum": [
"me",
"agent",
"unassigned"
],
"type": "string",
"description": "tasks: owner filter."
},
"query": {
"type": "string",
"description": "search: required semantic query. projects directory: name/purpose filter; check coverage."
},
"scope": {
"enum": [
"private",
"workspace"
],
"type": "string",
"description": "Projects: private overrides defaults; workspace requires workspaceId."
},
"areaId": {
"type": "string",
"description": "tasks: area filter; also applies to organize:project."
},
"bucket": {
"enum": [
"today",
"upcoming",
"anytime",
"someday"
],
"type": "string",
"description": "tasks: schedule bucket filter."
},
"cursor": {
"type": "string",
"description": "projects/tasks: prior nextCursor; keep the same filters. tasks: a page can be short and still have one; read until a reply has none."
},
"status": {
"enum": [
"open",
"in_progress",
"done",
"canceled",
"active",
"paused"
],
"type": "string",
"description": "tasks: status filter."
},
"target": {
"enum": [
"profile",
"projects",
"tasks",
"tracker",
"tracker_summary",
"rhythms",
"skills",
"tags",
"note_links",
"notes",
"search"
],
"type": "string",
"description": "What to read; first match in the tool description's ladder wins."
},
"taskId": {
"type": "string",
"description": "tasks: full detail. A repeating task returns seriesId/currentOccurrenceId; act on the current occurrence, not a completed ID."
},
"blocked": {
"type": "boolean",
"description": "tasks: only tasks with unmet dependsOn."
},
"section": {
"enum": [
"purpose",
"progress",
"resources",
"plan",
"instructions"
],
"type": "string",
"description": "projects/section: one Brief section."
},
"seedIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "note_links: required starting note IDs."
},
"skillId": {
"type": "string",
"description": "skills: required for one unless name is given; optional run scope for runs."
},
"dateAxis": {
"enum": [
"created",
"valid"
],
"type": "string",
"description": "notes: timeRange axis; created = when written, valid = when the fact holds."
},
"dueRange": {
"type": "object",
"properties": {
"end": {
"type": "number"
},
"start": {
"type": "number"
}
},
"description": "tasks: due-date window (ms epoch)."
},
"eventKey": {
"type": "string",
"description": "Projects interactions: actor event key; omit to page."
},
"maxDepth": {
"type": "number",
"description": "tags/related: maximum traversal depth."
},
"maxNodes": {
"type": "number",
"description": "note_links: node cap for depth > 1; default 50."
},
"organize": {
"enum": [
"area",
"project",
"heading"
],
"type": "string",
"description": "tasks: list containers instead of tasks."
},
"rhythmId": {
"type": "string",
"description": "rhythms: required for one; optional run scope for runs."
},
"seriesId": {
"type": "string",
"description": "tasks: complete recurring-series history, newest first, including completed occurrences."
},
"edgeTypes": {
"type": "array",
"items": {
"type": "string"
},
"description": "note_links: only follow/return these relationship types."
},
"minWeight": {
"type": "number",
"description": "tags/related: minimum edge weight (default 0.4)."
},
"orgStatus": {
"enum": [
"active",
"paused",
"done",
"canceled"
],
"type": "string",
"description": "tasks organize:project: Project status filter."
},
"projectId": {
"type": "string",
"description": "projects brief/section/resources/resource/history: required stable Project ID. tasks: Project filter or heading parent."
},
"timeRange": {
"type": "object",
"properties": {
"end": {
"type": "number"
},
"start": {
"type": "number"
}
},
"description": "search/notes: time window (ms epoch)."
},
"trackerId": {
"type": "string",
"description": "Required for tracker/entries and tracker_summary."
},
"blockNames": {
"type": "array",
"items": {
"type": "string"
},
"description": "profile: exact block names."
},
"confidence": {
"type": "object",
"properties": {
"max": {
"type": "number"
},
"min": {
"type": "number"
}
},
"description": "notes: confidence range."
},
"ifRevision": {
"type": "string",
"description": "profile: last-read revision; returns {unchanged:true} if unchanged."
},
"projectKey": {
"type": "string",
"description": "profile: include subconscious:<projectKey>."
},
"resourceId": {
"type": "string",
"description": "Projects resource: read the authorized current source."
},
"enabledOnly": {
"type": "boolean",
"description": "rhythms/list: only enabled rhythms."
},
"resourceState": {
"enum": [
"attached",
"suggested",
"removed"
],
"type": "string"
},
"graphTraversal": {
"type": "boolean",
"description": "search: opt into tag/link graph expansion (default false; measured recall loss). Use only for deliberate graph exploration."
},
"includeArchived": {
"type": "boolean",
"description": "Include archived trackers, Projects, or task containers."
},
"includeCompleted": {
"type": "boolean",
"description": "tasks: include done/canceled; default false. An explicit status wins."
},
"includeRelations": {
"type": "boolean",
"description": "tags/list: include parents/children/synonyms."
}
}
}| string |
| Exact metadata.bundle_sha256; report absent metadata as unversioned. |
| installedSkillSource | string | Manage plugin copies via plugin manager; standalone via approved archive installation. |
| installedSkillStatus | string | Read installed skill, then report. Legacy omission returns not_reported. |
| installedSkillVersion | string | Exact installed metadata.version; omit if missing or unversioned. |
{
"type": "object",
"properties": {
"tz": {
"type": "string",
"description": "IANA timezone for today/overdue boundaries (e.g. America/New_York); default UTC."
},
"projectKey": {
"type": "string",
"description": "Include subconscious:<projectKey>; exclude all other subconscious blocks."
},
"installedSkillSha256": {
"type": "string",
"description": "Exact metadata.bundle_sha256; report absent metadata as unversioned."
},
"installedSkillSource": {
"enum": [
"standalone",
"plugin",
"unsupported",
"unknown"
],
"type": "string",
"description": "Manage plugin copies via plugin manager; standalone via approved archive installation."
},
"installedSkillStatus": {
"enum": [
"versioned",
"unversioned",
"missing"
],
"type": "string",
"description": "Read installed skill, then report. Legacy omission returns not_reported."
},
"installedSkillVersion": {
"type": "string",
"description": "Exact installed metadata.version; omit if missing or unversioned."
}
}
}| boolean |
| Did the user accept the previous tour stop's offer? |
| expectedRevision | integer | Returned revision; stage only. |
{
"type": "object",
"properties": {
"stop": {
"type": "integer",
"maximum": 4,
"minimum": 0,
"description": "Tour stop, with phase tour."
},
"phase": {
"enum": [
"start",
"import",
"gaps",
"tour",
"finish"
],
"type": "string",
"description": "Phase to run; omit to start."
},
"client": {
"type": "string",
"description": "Actual host: claude-desktop, claude-code, codex, chatgpt or other; tailors paste guidance."
},
"counts": {
"type": "object",
"properties": {
"answers": {
"type": "integer",
"minimum": 0
},
"imported": {
"type": "integer",
"minimum": 0
},
"featuresCreated": {
"type": "integer",
"minimum": 0
}
},
"description": "Cumulative answers/featuresCreated. Ledger imports ignore imported; only committed receipts count."
},
"draftId": {
"type": "string",
"description": "Returned collection ID; stage only."
},
"importDraft": {
"type": "string",
"description": "Strict JSON {notes,profiles}; returned schema. 10 notes, 4 replacements, 64 KiB UTF-8. No approval/source/selection."
},
"skipForGood": {
"type": "boolean",
"description": "User requested permanent setup opt-out."
},
"importAction": {
"enum": [
"stage",
"status"
],
"type": "string",
"description": "Stage needs importDraft, draftId, expectedRevision. Status has no content. No model approval."
},
"prevAccepted": {
"type": "boolean",
"description": "Did the user accept the previous tour stop's offer?"
},
"expectedRevision": {
"type": "integer",
"minimum": 0,
"description": "Returned revision; stage only."
}
}
}| Argument | Type | Description |
|---|---|---|
| goal | string | rhythm: required run instructions; skill uses instructions instead. |
| kind | string | tracker: required; habit|metric|goal|log|status|custom. |
| name | string | Required: tracker/area/project/rhythm and entityType:"skill". skill_invoke/skill_run: alternative to skillId. Existing skill names preview changes; new names create. Active tracker duplicates are rejected; archived names reactivate. |
| tags | array | task: tags to attach. |
| unit | string | tracker: unit of measure. |
| actor | string | task/area/project/heading: actor (me|agent) recorded in activity ledger. |
| child | string | tag_relation: required child tag. |
| notes | array | string | note: array (max 100), each requires content and confidence (0–1), plus tags and exactly 3 sampleQuestions in the user’s voice; optional source/memoryType (episodic|semantic|procedural)/validFrom. task/area/project: markdown string. |
| order | number | task/area/project/heading: sort order. |
| owner | string | task: assignee. |
| patch | object | Project: sparse changes; omitted fields stay. Max 25 step/resource changes. |
| scope | string | Profile: global|workspace. Projects: private; workspace requires workspaceId. |
| title | string | task/heading: required title/label. |
| areaId | string | project: required parent area. |
| parent | string | tag_relation: required parent tag of child_of edge. |
| source | string | note/tracker_entry: provenance; defaults conversation/agent-mcp respectively. |
| status | string | task: initial status. |
| whenAt | number | task/project: schedule date (ms epoch). |
| content | string | profile: required block content. |
| deliver | object | entityType:"skill": required with trigger; rhythm: required. Omit for on-demand. Scheduled output: {kind:'note',tags?:string[]}|{kind:'profile_block',blockName:string}|{kind:'notify'}. |
| entries | array | tracker_entry: up to 100 for one trackerId; each {payload,loggedAt?,agentNote?,noteIds?,source?,metadata?,externalId?}. Mutually exclusive with top-level payload. Receipts list saved/failed items and duplicates for stored externalIds; do not claim all saved from a partial result. |
| noteIds | array | tracker_entry: archival note IDs to attach. tracker_note_link: required note IDs to link. |
| payload | object | tracker_entry: tracker-defined data point; required unless entries is used. |
| posture | string | entityType:"skill" with trigger, or rhythm: read|propose|act; default read. |
| skillId | string | skill_invoke/skill_run: skill to run now/begin; required unless name is given. |
| trigger | object | entityType:"skill": optional; rhythm: required. Requires deliver. Penny does not run it; due signals reach the connected agent. Schedule: {kind:"schedule",cadence:"daily"|"weekly"|"monthly",at?:"Fri 16:00",timezone?:"America/Denver"}. ALWAYS set IANA timezone; default UTC shifts local times. Event: {kind:"event",on:"note.created",where?:{tags?:string[]}}. |
| deadline | number | task/project: hard due date (ms epoch). |
| rhythmId | string | rhythm_run: rhythm to begin; or pass name. |
| agentNote | string | tracker_entry, single only: short non-searchable caption. |
| blockName | string | profile: required block name to upsert. |
| dependsOn | array | task: full prerequisite taskId set; replaces all. |
| headingId | string | task: parent heading. |
| linkNotes | array | task: note IDs to link. |
| projectId | string | task: parent Project. heading: required parent Project. |
| reasoning | string | tag_relation: short edge justification, typically a user quote. |
| trackerId | string | tracker_entry: required tracker to log against. |
| entityType* | string | What to create; first match in the tool description's ladder wins. |
| externalId | string | tracker_entry, also entries items: source record ID, max 200 chars. Use for imports/sync: repeats on the same tracker return the existing entry as duplicate. Opaque, unencrypted: never include content. |
| recordedAt | number | tracker_entry, single only: observation time (ms epoch); default now. |
| recurrence | object | task: repeat. Returned taskId is the first occurrence; completion returns nextTaskId (see penny_edit status). Never reuse a completed occurrence's ID. |
| targetSpec | object | tracker: JSON target spec, interpreted at retrieval (e.g. {kind:'daily_minimum',value:10000}). |
| whenBucket | string | task/project: undated bucket; mutually exclusive with whenAt. |
| description | string | tracker: required meaning. entityType:"skill"/rhythm: required one-line purpose, including on-demand skills. |
| interaction | object | project_interaction: actor decision; read first, update with expectedUpdatedAt. |
| operationId | string | Project receipt key; identical retries only. |
| instructions | string | skill: required know-how for invocation or when a connected agent picks up a due skill. Replaces rhythm goal. |
| retrievalPlan | array | entityType:"skill"/rhythm: optional deterministic steps [{tool,args}] for a bounded tier. |
| trackerEntryId | string | tracker_note_link: required entry to attach notes to. |
| expectedRevision | number | Project revision from Brief; reconcile conflicts. |
| expectedUpdatedAt | number | Source version from read. |
{
"type": "object",
"required": [
"entityType"
],
"properties": {
"goal": {
"type": "string",
"description": "rhythm: required run instructions; skill uses instructions instead."
},
"kind": {
"type": "string",
"description": "tracker: required; habit|metric|goal|log|status|custom."
},
"name": {
"type": "string",
"description": "Required: tracker/area/project/rhythm and entityType:\"skill\". skill_invoke/skill_run: alternative to skillId. Existing skill names preview changes; new names create. Active tracker duplicates are rejected; archived names reactivate."
},
"tags": {
"type": "array",
"items": {
"type": "string"
},
"description": "task: tags to attach."
},
"unit": {
"type": "string",
"description": "tracker: unit of measure."
},
"actor": {
"type": "string",
"description": "task/area/project/heading: actor (me|agent) recorded in activity ledger."
},
"child": {
"type": "string",
"description": "tag_relation: required child tag."
},
"notes": {
"type": [
"array",
"string"
],
"description": "note: array (max 100), each requires content and confidence (0–1), plus tags and exactly 3 sampleQuestions in the user’s voice; optional source/memoryType (episodic|semantic|procedural)/validFrom. task/area/project: markdown string."
},
"order": {
"type": "number",
"description": "task/area/project/heading: sort order."
},
"owner": {
"enum": [
"me",
"agent",
"unassigned"
],
"type": "string",
"description": "task: assignee."
},
"patch": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"notes": {
"type": "string"
},
"order": {
"type": "number"
},
"steps": {
"type": "array",
"items": {
"type": "object",
"required": [
"op",
"stepId"
],
"properties": {
"op": {
"enum": [
"suggest",
"edit",
"dismiss",
"accept"
],
"type": "string"
},
"text": {
"type": "string"
},
"order": {
"type": "number"
},
"stepId": {
"type": "string"
}
}
},
"maxItems": 25,
"description": "accept turns a saved suggestion into a To-do."
},
"areaId": {
"type": [
"string",
"null"
]
},
"status": {
"enum": [
"active",
"paused",
"done",
"canceled"
],
"type": "string"
},
"whenAt": {
"type": [
"number",
"null"
]
},
"purpose": {
"type": "string"
},
"archived": {
"type": "boolean"
},
"deadline": {
"type": [
"number",
"null"
]
},
"progress": {
"type": "string"
},
"resources": {
"type": "array",
"items": {
"type": "object",
"required": [
"op"
],
"properties": {
"op": {
"enum": [
"attach",
"suggest",
"remove",
"restore"
],
"type": "string"
},
"url": {
"type": [
"string",
"null"
]
},
"role": {
"enum": [
"reference",
"method"
],
"type": "string"
},
"label": {
"type": [
"string",
"null"
]
},
"reason": {
"enum": [
"created_for",
"deliberately_used",
"suggested"
],
"type": "string"
},
"source": {
"type": "object",
"required": [
"kind",
"id",
"scope"
],
"properties": {
"id": {
"type": "string"
},
"kind": {
"enum": [
"note",
"task",
"tracker",
"tracker_entry",
"skill",
"profile_block",
"external"
],
"type": "string"
},
"scope": {
"type": "object",
"required": [
"kind"
],
"properties": {
"kind": {
"enum": [
"private",
"workspace"
],
"type": "string"
},
"orgId": {
"type": "string"
},
"workspaceId": {
"type": "string"
}
}
}
}
},
"resourceId": {
"type": "string"
}
}
},
"maxItems": 25,
"description": "Attach created_for/deliberately_used sources; otherwise suggest. Removed links need restore; links do not share source content."
},
"checkpoint": {
"type": "string",
"description": "Factual handoff: changes, unfinished work, next step (4 KiB)."
},
"whenBucket": {
"enum": [
"anytime",
"someday",
null
],
"type": [
"string",
"null"
]
},
"instructions": {
"type": "string"
}
},
"description": "Project: sparse changes; omitted fields stay. Max 25 step/resource changes.",
"additionalProperties": false
},
"scope": {
"enum": [
"global",
"workspace",
"private"
],
"type": "string",
"description": "Profile: global|workspace. Projects: private; workspace requires workspaceId."
},
"title": {
"type": "string",
"description": "task/heading: required title/label."
},
"areaId": {
"type": "string",
"description": "project: required parent area."
},
"parent": {
"type": "string",
"description": "tag_relation: required parent tag of child_of edge."
},
"source": {
"type": "string",
"description": "note/tracker_entry: provenance; defaults conversation/agent-mcp respectively."
},
"status": {
"enum": [
"open",
"in_progress",
"done",
"canceled"
],
"type": "string",
"description": "task: initial status."
},
"whenAt": {
"type": "number",
"description": "task/project: schedule date (ms epoch)."
},
"content": {
"type": "string",
"description": "profile: required block content."
},
"deliver": {
"type": "object",
"description": "entityType:\"skill\": required with trigger; rhythm: required. Omit for on-demand. Scheduled output: {kind:'note',tags?:string[]}|{kind:'profile_block',blockName:string}|{kind:'notify'}."
},
"entries": {
"type": "array",
"description": "tracker_entry: up to 100 for one trackerId; each {payload,loggedAt?,agentNote?,noteIds?,source?,metadata?,externalId?}. Mutually exclusive with top-level payload. Receipts list saved/failed items and duplicates for stored externalIds; do not claim all saved from a partial result."
},
"noteIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "tracker_entry: archival note IDs to attach. tracker_note_link: required note IDs to link."
},
"payload": {
"type": "object",
"description": "tracker_entry: tracker-defined data point; required unless entries is used."
},
"posture": {
"type": "string",
"description": "entityType:\"skill\" with trigger, or rhythm: read|propose|act; default read."
},
"skillId": {
"type": "string",
"description": "skill_invoke/skill_run: skill to run now/begin; required unless name is given."
},
"trigger": {
"type": "object",
"description": "entityType:\"skill\": optional; rhythm: required. Requires deliver. Penny does not run it; due signals reach the connected agent. Schedule: {kind:\"schedule\",cadence:\"daily\"|\"weekly\"|\"monthly\",at?:\"Fri 16:00\",timezone?:\"America/Denver\"}. ALWAYS set IANA timezone; default UTC shifts local times. Event: {kind:\"event\",on:\"note.created\",where?:{tags?:string[]}}."
},
"deadline": {
"type": "number",
"description": "task/project: hard due date (ms epoch)."
},
"rhythmId": {
"type": "string",
"description": "rhythm_run: rhythm to begin; or pass name."
},
"agentNote": {
"type": "string",
"description": "tracker_entry, single only: short non-searchable caption."
},
"blockName": {
"type": "string",
"description": "profile: required block name to upsert."
},
"dependsOn": {
"type": "array",
"items": {
"type": "string"
},
"description": "task: full prerequisite taskId set; replaces all."
},
"headingId": {
"type": "string",
"description": "task: parent heading."
},
"linkNotes": {
"type": "array",
"items": {
"type": "string"
},
"description": "task: note IDs to link."
},
"projectId": {
"type": "string",
"description": "task: parent Project. heading: required parent Project."
},
"reasoning": {
"type": "string",
"description": "tag_relation: short edge justification, typically a user quote."
},
"trackerId": {
"type": "string",
"description": "tracker_entry: required tracker to log against."
},
"entityType": {
"enum": [
"profile",
"task",
"area",
"project",
"project_interaction",
"heading",
"tracker",
"tracker_entry",
"rhythm",
"rhythm_run",
"skill",
"skill_invoke",
"skill_run",
"tag_relation",
"tracker_note_link",
"note"
],
"type": "string",
"description": "What to create; first match in the tool description's ladder wins."
},
"externalId": {
"type": "string",
"description": "tracker_entry, also entries items: source record ID, max 200 chars. Use for imports/sync: repeats on the same tracker return the existing entry as duplicate. Opaque, unencrypted: never include content."
},
"recordedAt": {
"type": "number",
"description": "tracker_entry, single only: observation time (ms epoch); default now."
},
"recurrence": {
"type": "object",
"required": [
"cadence"
],
"properties": {
"at": {
"type": "string",
"description": "daily: HH:MM; weekly: <Wd> HH:MM; monthly: DD HH:MM."
},
"cadence": {
"enum": [
"daily",
"weekly",
"monthly"
],
"type": "string"
},
"timezone": {
"type": "string",
"description": "IANA timezone (e.g. America/New_York)."
}
},
"description": "task: repeat. Returned taskId is the first occurrence; completion returns nextTaskId (see penny_edit status). Never reuse a completed occurrence's ID."
},
"targetSpec": {
"type": "object",
"description": "tracker: JSON target spec, interpreted at retrieval (e.g. {kind:'daily_minimum',value:10000})."
},
"whenBucket": {
"enum": [
"anytime",
"someday"
],
"type": "string",
"description": "task/project: undated bucket; mutually exclusive with whenAt."
},
"description": {
"type": "string",
"description": "tracker: required meaning. entityType:\"skill\"/rhythm: required one-line purpose, including on-demand skills."
},
"interaction": {
"type": "object",
"required": [
"kind",
"state"
],
"properties": {
"kind": {
"enum": [
"proposal",
"attention"
],
"type": "string"
},
"state": {
"enum": [
"proposed",
"declined",
"deferred",
"presented",
"dismissed",
"accepted"
],
"type": "string"
},
"taskId": {
"type": "string"
},
"content": {
"type": "string",
"description": "Rationale required for reconsideration."
},
"eventKey": {
"type": "string"
},
"objective": {
"type": "string",
"description": "First proposal objective."
},
"reconsider": {
"type": "boolean"
},
"urgencyKey": {
"type": "string"
},
"deferredUntil": {
"type": "number"
},
"expectedUpdatedAt": {
"type": "number"
}
},
"description": "project_interaction: actor decision; read first, update with expectedUpdatedAt."
},
"operationId": {
"type": "string",
"description": "Project receipt key; identical retries only."
},
"instructions": {
"type": "string",
"description": "skill: required know-how for invocation or when a connected agent picks up a due skill. Replaces rhythm goal."
},
"retrievalPlan": {
"type": "array",
"description": "entityType:\"skill\"/rhythm: optional deterministic steps [{tool,args}] for a bounded tier."
},
"trackerEntryId": {
"type": "string",
"description": "tracker_note_link: required entry to attach notes to."
},
"expectedRevision": {
"type": "number",
"description": "Project revision from Brief; reconcile conflicts."
},
"expectedUpdatedAt": {
"type": "number",
"description": "Source version from read."
}
}
}