Raw schema
{
"type": "object",
"properties": {
"actor": {
"description": "entityType:\"task\"/\"area\"/\"project\"/\"heading\" β who took the action (me|agent), written to the activity ledger.",
"type": "string"
},
"agentNote": {
"description": "entityType:\"tracker_entry\" (single-entry form only) β short caption on this one data point (not searchable).",
"type": "string"
},
"areaId": {
"description": "entityType:\"project\" (required) β the area the project belongs to.",
"type": "string"
},
"blockName": {
"description": "entityType:\"profile\" (required) β the profile block name to upsert.",
"type": "string"
},
"child": {
"description": "entityType:\"tag_relation\" (required) β the child tag.",
"type": "string"
},
"content": {
"description": "entityType:\"profile\" (required) β the block content.",
"type": "string"
},
"deadline": {
"description": "entityType:\"task\"/\"project\" β hard due date (ms epoch).",
"type": "number"
},
"deliver": {
"description": "entityType:\"skill\" β REQUIRED once `trigger` is set (and on the legacy entityType:\"rhythm\"); omit on an on-demand skill. Where a scheduled run's output lands: { kind:'note', tags?:string[] } | { kind:'profile_block', blockName:string } | { kind:'notify' }.",
"type": "object"
},
"dependsOn": {
"description": "entityType:\"task\" β full replacement set of taskIds that must complete first.",
"items": {
"type": "string"
},
"type": "array"
},
"description": {
"description": "entityType:\"tracker\" (required) β natural-language meaning. entityType:\"skill\" (required β every skill, on-demand or scheduled) or legacy \"rhythm\" β one-line description of what it is for.",
"type": "string"
},
"entityType": {
"description": "What to create. Walk the ladder in the tool description; first match wins.",
"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"
},
"entries": {
"description": "tracker_entry: batch up to 100 entries for one trackerId; each {payload,loggedAt?,agentNote?,noteIds?,source?,metadata?}. Mutually exclusive with top-level payload. Receipts report each saved/failed item; do not claim all saved from a partial result.",
"type": "array"
},
"expectedRevision": {
"description": "Project edit revision from Brief; reconcile conflicts.",
"type": "number"
},
"expectedUpdatedAt": {
"description": "Source version from the read.",
"type": "number"
},
"goal": {
"description": "entityType:\"rhythm\" (required) β natural-language instruction: what the run should do. On entityType:\"skill\" this is `instructions`.",
"type": "string"
},
"headingId": {
"description": "entityType:\"task\" β heading to file the task under.",
"type": "string"
},
"instructions": {
"description": "entityType:\"skill\" (required) β the saved know-how: what to do when the skill is invoked, or when a connected agent picks it up after it comes due. Generalizes the rhythm \"goal\".",
"type": "string"
},
"interaction": {
"description": "project_interaction: actor decision; read first, update with expectedUpdatedAt.",
"properties": {
"content": {
"description": "Rationale required for reconsideration.",
"type": "string"
},
"deferredUntil": {
"type": "number"
},
"eventKey": {
"type": "string"
},
"expectedUpdatedAt": {
"type": "number"
},
"kind": {
"enum": [
"proposal",
"attention"
],
"type": "string"
},
"objective": {
"description": "First proposal objective.",
"type": "string"
},
"reconsider": {
"type": "boolean"
},
"state": {
"enum": [
"proposed",
"declined",
"deferred",
"presented",
"dismissed",
"accepted"
],
"type": "string"
},
"taskId": {
"type": "string"
},
"urgencyKey": {
"type": "string"
}
},
"required": [
"kind",
"state"
],
"type": "object"
},
"kind": {
"description": "entityType:\"tracker\" (required) β habit | metric | goal | log | status | custom.",
"type": "string"
},
"linkNotes": {
"description": "entityType:\"task\" β note ids to link to this task.",
"items": {
"type": "string"
},
"type": "array"
},
"name": {
"description": "Required for tracker/area/project and entityType:\"skill\" (also rhythm); for skill_invoke/skill_run, an alternative to skillId. Existing skill names prepare a change preview; new names create. Active tracker duplicates are rejected; archived names reactivate.",
"type": "string"
},
"noteIds": {
"description": "entityType:\"tracker_entry\" β archival note ids to attach; or \"tracker_note_link\" (required) β the notes to link.",
"items": {
"type": "string"
},
"type": "array"
},
"notes": {
"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.",
"type": [
"array",
"string"
]
},
"operationId": {
"description": "Project receipt key; identical retries only.",
"type": "string"
},
"order": {
"description": "entityType:\"task\"/\"area\"/\"project\"/\"heading\" β sort order.",
"type": "number"
},
"owner": {
"description": "entityType:\"task\" β assignee.",
"enum": [
"me",
"agent",
"unassigned"
],
"type": "string"
},
"parent": {
"description": "entityType:\"tag_relation\" (required) β the parent tag in the child_of edge.",
"type": "string"
},
"patch": {
"additionalProperties": false,
"description": "Project sparse changes; omitted fields stay. Max 25 step/resource changes.",
"properties": {
"archived": {
"type": "boolean"
},
"areaId": {
"type": [
"string",
"null"
]
},
"checkpoint": {
"description": "Factual handoff: changes, unfinished work, next step (4 KiB).",
"type": "string"
},
"deadline": {
"type": [
"number",
"null"
]
},
"instructions": {
"type": "string"
},
"name": {
"type": "string"
},
"notes": {
"type": "string"
},
"order": {
"type": "number"
},
"progress": {
"type": "string"
},
"purpose": {
"type": "string"
},
"resources": {
"description": "Attach created_for/deliberately_used sources; otherwise suggest. Removed links need restore; links do not share source content.",
"items": {
"properties": {
"label": {
"type": [
"string",
"null"
]
},
"op": {
"enum": [
"attach",
"suggest",
"remove",
"restore"
],
"type": "string"
},
"reason": {
"enum": [
"created_for",
"deliberately_used",
"suggested"
],
"type": "string"
},
"resourceId": {
"type": "string"
},
"role": {
"enum": [
"reference",
"method"
],
"type": "string"
},
"source": {
"properties": {
"id": {
"type": "string"
},
"kind": {
"enum": [
"note",
"task",
"tracker",
"tracker_entry",
"skill",
"profile_block",
"external"
],
"type": "string"
},
"scope": {
"properties": {
"kind": {
"enum": [
"private",
"workspace"
],
"type": "string"
},
"orgId": {
"type": "string"
},
"workspaceId": {
"type": "string"
}
},
"required": [
"kind"
],
"type": "object"
}
},
"required": [
"kind",
"id",
"scope"
],
"type": "object"
},
"url": {
"type": [
"string",
"null"
]
}
},
"required": [
"op"
],
"type": "object"
},
"maxItems": 25,
"type": "array"
},
"status": {
"enum": [
"active",
"paused",
"done",
"canceled"
],
"type": "string"
},
"steps": {
"description": "accept converts a saved suggestion into a To-do.",
"items": {
"properties": {
"op": {
"enum": [
"suggest",
"edit",
"dismiss",
"accept"
],
"type": "string"
},
"order": {
"type": "number"
},
"stepId": {
"type": "string"
},
"text": {
"type": "string"
}
},
"required": [
"op",
"stepId"
],
"type": "object"
},
"maxItems": 25,
"type": "array"
},
"whenAt": {
"type": [
"number",
"null"
]
},
"whenBucket": {
"enum": [
"anytime",
"someday",
null
],
"type": [
"string",
"null"
]
}
},
"type": "object"
},
"payload": {
"description": "entityType:\"tracker_entry\" (required unless `entries` is used) β the structured data point; shape is tracker-defined.",
"type": "object"
},
"posture": {
"description": "entityType:\"skill\" with a `trigger` set (or legacy \"rhythm\") β read | propose | act (defaults 'read').",
"type": "string"
},
"projectId": {
"description": "entityType:\"task\" β parent project; or \"heading\" β the project it belongs to (required).",
"type": "string"
},
"reasoning": {
"description": "entityType:\"tag_relation\" β short justification (typically a user quote) for the edge.",
"type": "string"
},
"recordedAt": {
"description": "entityType:\"tracker_entry\" (single-entry form only) β observation time (ms epoch; defaults to now).",
"type": "number"
},
"recurrence": {
"description": "entityType:\"task\" β makes the task repeat. The returned `taskId` is this task's first occurrence; completing it later returns `nextTaskId` for the next one (see penny_edit's `status` field) β don't cache this id past its first completion.",
"properties": {
"at": {
"description": "Time expression: \"HH:MM\" for daily, \"<Wd> HH:MM\" for weekly, \"DD HH:MM\" for monthly.",
"type": "string"
},
"cadence": {
"enum": [
"daily",
"weekly",
"monthly"
],
"type": "string"
},
"timezone": {
"description": "IANA timezone (e.g. America/New_York).",
"type": "string"
}
},
"required": [
"cadence"
],
"type": "object"
},
"retrievalPlan": {
"description": "entityType:\"skill\" (or legacy \"rhythm\") β OPTIONAL deterministic steps [{ tool, args }] for a bounded tier.",
"type": "array"
},
"rhythmId": {
"description": "entityType:\"rhythm_run\" β the rhythm to begin a run of (or pass `name`).",
"type": "string"
},
"scope": {
"description": "Profile: global|workspace. Projects: private; workspace requires workspaceId.",
"enum": [
"global",
"workspace",
"private"
],
"type": "string"
},
"skillId": {
"description": "entityType:\"skill_invoke\" (required, or pass `name`) β the skill to run now. entityType:\"skill_run\" β the skill to begin a run of (or pass `name`).",
"type": "string"
},
"source": {
"description": "entityType:\"note\"/\"tracker_entry\" β provenance label (defaults 'conversation' / 'agent-mcp').",
"type": "string"
},
"status": {
"description": "entityType:\"task\" β initial status.",
"enum": [
"open",
"in_progress",
"done",
"canceled"
],
"type": "string"
},
"tags": {
"description": "entityType:\"task\" β tags to attach.",
"items": {
"type": "string"
},
"type": "array"
},
"targetSpec": {
"description": "entityType:\"tracker\" β JSON target spec, interpreted at retrieval (e.g. { kind: 'daily_minimum', value: 10000 }).",
"type": "object"
},
"title": {
"description": "entityType:\"task\" (required) or \"heading\" (required) β the title/label.",
"type": "string"
},
"trackerEntryId": {
"description": "entityType:\"tracker_note_link\" (required) β the logged tracker entry to attach notes to.",
"type": "string"
},
"trackerId": {
"description": "entityType:\"tracker_entry\" (required) β the tracker to log against.",
"type": "string"
},
"trigger": {
"description": "entityType:\"skill\": optional schedule (required for rhythm), 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 timezone (IANA); default UTC shifts local times. Event: {kind:\"event\",on:\"note.created\",where?:{tags?:string[]}}.",
"type": "object"
},
"unit": {
"description": "entityType:\"tracker\" β unit of measure.",
"type": "string"
},
"whenAt": {
"description": "entityType:\"task\"/\"project\" β schedule date (ms epoch).",
"type": "number"
},
"whenBucket": {
"description": "entityType:\"task\"/\"project\" β undated bucket; mutually exclusive with whenAt.",
"enum": [
"anytime",
"someday"
],
"type": "string"
}
},
"required": [
"entityType"
]
}