Design contracts. Bound stubs are not implemented business behavior. JSON Schema cannot express all cross-field or stored-state obligations.
56 approved services · 52 product API operations · 22 product MCP tools
Page API references declare intended usage; actual page calls are not enforced here. Widget sources declare intended connections, not payload compatibility; planned projection gaps are explicit and no product artifacts are published. Event relationships declare possible emission; transaction, replay and external-producer behavior remain implementation obligations. Event-specific gaps are listed explicitly.
Feature filters include both the surface owner and referenced service requirements. Cross-feature dependencies stay visible. Bound means a declared mapping, not implemented business behavior. Widgets display results; prompts name required capabilities, not execution sequences.
186 declared paths
| Review entry | API / MCP operation | Services | Possible events | Result displays / gaps |
|---|---|---|---|---|
| /termspage · scaffoldTermsScaffold legal-route continuity | — | No service mapping | No emissions declared | No API dependencies declared; local/framework behavior is outside this service map. |
| /privacypage · scaffoldPrivacyScaffold legal-route continuity | — | No service mapping | No emissions declared | No API dependencies declared; local/framework behavior is outside this service map. |
| /cookiespage · scaffoldCookiesScaffold legal-route continuity | — | No service mapping | No emissions declared | No API dependencies declared; local/framework behavior is outside this service map. |
| /examplepage · scaffoldExampleTemporary scaffold reference | API → example.list |
No service mapping | No emissions declared | Retained scaffold API has no product service descriptor. |
| /examplepage · scaffoldExampleTemporary scaffold reference | API → example.create |
No service mapping | No emissions declared | Retained scaffold API has no product service descriptor. |
| /examplepage · scaffoldExampleTemporary scaffold reference | API → example.delete |
No service mapping | No emissions declared | Retained scaffold API has no product service descriptor. |
| /page · pendingObjectivesF3 ObjectivesCross-feature | API → record.queryMapping: bound |
record.queryF7 Sessions · contract-only | No emissions declared | |
| /page · pendingObjectivesF3 Objectives | API → objectives.createMapping: bound |
objectives.createF3 Objectives · contract-only | objective_createdAfter durable creation; no replay duplicate. | |
| /page · pendingObjectivesF3 ObjectivesCross-feature | API → results.getVia overlay: result-update-dialMapping: bound |
results.getF4 Results · contract-only | No emissions declared | |
| /page · pendingObjectivesF3 ObjectivesCross-feature | API → result_logs.createVia overlay: result-update-dialMapping: bound |
result_logs.createF4 Results · contract-only | result_update_recordedWhen numeric/performance evidence or a milestone flip is saved; not comment-only rows. | |
| /page · pendingObjectivesF3 ObjectivesCross-feature | API → habit_logs.setVia overlay: result-update-dialMapping: bound |
habit_logs.setF4 Results · contract-only | result_update_recordedWhen a habit mark/unmark changes recorded progress; not comment-only changes or replay. | |
| /page · pendingObjectivesF3 ObjectivesCross-feature | API → notes.getVia overlay: note-editorMapping: bound |
notes.getF6 Notes · contract-only | No emissions declared | |
| /page · pendingObjectivesF3 ObjectivesCross-feature | API → notes.createVia overlay: note-editorMapping: bound |
notes.createF6 Notes · contract-only | note_createdAfter durable creation; not autosave updates or receipt replay. | |
| /page · pendingObjectivesF3 ObjectivesCross-feature | API → notes.updateVia overlay: note-editorMapping: bound |
notes.updateF6 Notes · contract-only | No emissions declared | |
| /page · pendingObjectivesF3 ObjectivesCross-feature | API → notes.deleteVia overlay: note-editorMapping: bound |
notes.deleteF6 Notes · contract-only | No emissions declared | |
| /objectives/:idpage · pendingObjectiveF3 Objectives | API → objectives.getMapping: bound |
objectives.getF3 Objectives · contract-only | No emissions declared | |
| /objectives/:idpage · pendingObjectiveF3 Objectives | API → objectives.createMapping: bound |
objectives.createF3 Objectives · contract-only | objective_createdAfter durable creation; no replay duplicate. | |
| /objectives/:idpage · pendingObjectiveF3 Objectives | API → objectives.updateMapping: bound |
objectives.updateF3 Objectives · contract-only | No emissions declared | |
| /objectives/:idpage · pendingObjectiveF3 Objectives | API → objectives.deleteMapping: bound |
objectives.deleteF3 Objectives · contract-only | No emissions declared | |
| /objectives/:idpage · pendingObjectiveF3 ObjectivesCross-feature | API → results.createMapping: bound |
results.createF4 Results · contract-only | No emissions declared | |
| /objectives/:idpage · pendingObjectiveF3 ObjectivesCross-feature | API → actions.createMapping: bound |
actions.createF5 Actions · contract-only | action_createdAfter durable creation; no replay duplicate. | |
| /objectives/:idpage · pendingObjectiveF3 ObjectivesCross-feature | API → action_logs.createMapping: bound |
action_logs.createF5 Actions · contract-only | action_status_changedFor each persisted log, including repeat status with comment; not receipt replay. | |
| /objectives/:idpage · pendingObjectiveF3 ObjectivesCross-feature | API → results.getVia overlay: result-update-dialMapping: bound |
results.getF4 Results · contract-only | No emissions declared | |
| /objectives/:idpage · pendingObjectiveF3 ObjectivesCross-feature | API → result_logs.createVia overlay: result-update-dialMapping: bound |
result_logs.createF4 Results · contract-only | result_update_recordedWhen numeric/performance evidence or a milestone flip is saved; not comment-only rows. | |
| /objectives/:idpage · pendingObjectiveF3 ObjectivesCross-feature | API → habit_logs.setVia overlay: result-update-dialMapping: bound |
habit_logs.setF4 Results · contract-only | result_update_recordedWhen a habit mark/unmark changes recorded progress; not comment-only changes or replay. | |
| /results/:idpage · pendingResultF4 Results | API → results.getMapping: bound |
results.getF4 Results · contract-only | No emissions declared | |
| /results/:idpage · pendingResultF4 Results | API → result_logs.listMapping: bound |
result_logs.listF4 Results · contract-only | No emissions declared | |
| /results/:idpage · pendingResultF4 Results | API → habit_logs.listMapping: bound |
habit_logs.listF4 Results · contract-only | No emissions declared | |
| /results/:idpage · pendingResultF4 Results | API → results.createMapping: bound |
results.createF4 Results · contract-only | No emissions declared | |
| /results/:idpage · pendingResultF4 Results | API → results.updateMapping: bound |
results.updateF4 Results · contract-only | No emissions declared | |
| /results/:idpage · pendingResultF4 Results | API → results.deleteMapping: bound |
results.deleteF4 Results · contract-only | No emissions declared | |
| /results/:idpage · pendingResultF4 Results | API → result_logs.createMapping: bound |
result_logs.createF4 Results · contract-only | result_update_recordedWhen numeric/performance evidence or a milestone flip is saved; not comment-only rows. | |
| /results/:idpage · pendingResultF4 Results | API → result_logs.clear_commentMapping: bound |
result_logs.clear_commentF4 Results · contract-only | No emissions declared | |
| /results/:idpage · pendingResultF4 Results | API → result_logs.deleteMapping: bound |
result_logs.deleteF4 Results · contract-only | No emissions declared | |
| /results/:idpage · pendingResultF4 Results | API → habit_logs.setMapping: bound |
habit_logs.setF4 Results · contract-only | result_update_recordedWhen a habit mark/unmark changes recorded progress; not comment-only changes or replay. | |
| /results/:idpage · pendingResultF4 Results | API → results.getVia overlay: result-update-dialMapping: bound |
results.getF4 Results · contract-only | No emissions declared | |
| /results/:idpage · pendingResultF4 Results | API → result_logs.createVia overlay: result-update-dialMapping: bound |
result_logs.createF4 Results · contract-only | result_update_recordedWhen numeric/performance evidence or a milestone flip is saved; not comment-only rows. | |
| /results/:idpage · pendingResultF4 Results | API → habit_logs.setVia overlay: result-update-dialMapping: bound |
habit_logs.setF4 Results · contract-only | result_update_recordedWhen a habit mark/unmark changes recorded progress; not comment-only changes or replay. | |
| /actionspage · pendingActionsF5 Actions | API → actions.listMapping: bound |
actions.listF5 Actions · contract-only | No emissions declared | |
| /actionspage · pendingActionsF5 Actions | API → actions.createMapping: bound |
actions.createF5 Actions · contract-only | action_createdAfter durable creation; no replay duplicate. | |
| /actionspage · pendingActionsF5 Actions | API → actions.reorderMapping: bound |
actions.reorderF5 Actions · contract-only | No emissions declared | |
| /actionspage · pendingActionsF5 Actions | API → action_logs.createMapping: bound |
action_logs.createF5 Actions · contract-only | action_status_changedFor each persisted log, including repeat status with comment; not receipt replay. | |
| /actions/:idpage · pendingActionF5 Actions | API → actions.getMapping: bound |
actions.getF5 Actions · contract-only | No emissions declared | |
| /actions/:idpage · pendingActionF5 Actions | API → action_logs.listMapping: bound |
action_logs.listF5 Actions · contract-only | No emissions declared | |
| /actions/:idpage · pendingActionF5 Actions | API → actions.createMapping: bound |
actions.createF5 Actions · contract-only | action_createdAfter durable creation; no replay duplicate. | |
| /actions/:idpage · pendingActionF5 Actions | API → actions.updateMapping: bound |
actions.updateF5 Actions · contract-only | No emissions declared | |
| /actions/:idpage · pendingActionF5 Actions | API → actions.deleteMapping: bound |
actions.deleteF5 Actions · contract-only | No emissions declared | |
| /actions/:idpage · pendingActionF5 Actions | API → action_logs.createMapping: bound |
action_logs.createF5 Actions · contract-only | action_status_changedFor each persisted log, including repeat status with comment; not receipt replay. | |
| /actions/:idpage · pendingActionF5 Actions | API → action_logs.clear_commentMapping: bound |
action_logs.clear_commentF5 Actions · contract-only | No emissions declared | |
| /notespage · pendingNotesF6 Notes | API → notes.listMapping: bound |
notes.listF6 Notes · contract-only | No emissions declared | |
| /notespage · pendingNotesF6 Notes | API → notes.deleteMapping: bound |
notes.deleteF6 Notes · contract-only | No emissions declared | |
| /notespage · pendingNotesF6 Notes | API → notes.getVia overlay: note-editorMapping: bound |
notes.getF6 Notes · contract-only | No emissions declared | |
| /notespage · pendingNotesF6 Notes | API → notes.createVia overlay: note-editorMapping: bound |
notes.createF6 Notes · contract-only | note_createdAfter durable creation; not autosave updates or receipt replay. | |
| /notespage · pendingNotesF6 Notes | API → notes.updateVia overlay: note-editorMapping: bound |
notes.updateF6 Notes · contract-only | No emissions declared | |
| /notespage · pendingNotesF6 Notes | API → notes.deleteVia overlay: note-editorMapping: bound |
notes.deleteF6 Notes · contract-only | No emissions declared | |
| /notes/:idpage · pendingNoteF6 Notes | API → notes.getMapping: bound |
notes.getF6 Notes · contract-only | No emissions declared | |
| /notes/:idpage · pendingNoteF6 Notes | API → notes.updateMapping: bound |
notes.updateF6 Notes · contract-only | No emissions declared | |
| /notes/:idpage · pendingNoteF6 Notes | API → notes.deleteMapping: bound |
notes.deleteF6 Notes · contract-only | No emissions declared | |
| /sessionspage · pendingSessionsF7 Sessions | API → sessions.listMapping: bound |
sessions.listF7 Sessions · contract-only | No emissions declared | |
| /sessions/:idpage · pendingSessionF7 Sessions | API → sessions.getMapping: bound |
sessions.getF7 Sessions · contract-only | No emissions declared | |
| /sessions/:idpage · pendingSessionF7 SessionsCross-feature | API → action_logs.createMapping: bound |
action_logs.createF5 Actions · contract-only | action_status_changedFor each persisted log, including repeat status with comment; not receipt replay. | |
| /sessions/:id/briefingpage · pendingBriefingF7 Sessions | API → sessions.getMapping: bound |
sessions.getF7 Sessions · contract-only | No emissions declared | |
| /sessions/:id/summarypage · pendingSession summaryF7 Sessions | API → sessions.getMapping: bound |
sessions.getF7 Sessions · contract-only | No emissions declared | |
| /cyclespage · pendingCyclesF2 Cycles | API → cycles.listMapping: bound |
cycles.listF2 Cycles · contract-only | No emissions declared | |
| /cycles/newpage · pendingSet up a cycleF2 Cycles | API → cycles.createMapping: bound |
cycles.createF2 Cycles · contract-only | cycle_createdAfter durable creation; no replay duplicate. cycle_archivedWhen creation replaces an incumbent active cycle; reason replaced. |
|
| /cycles/:idpage · pendingCycleF2 Cycles | API → cycles.getMapping: bound |
cycles.getF2 Cycles · contract-only | No emissions declared | |
| /cycles/:idpage · pendingCycleF2 Cycles | API → cycles.updateMapping: bound |
cycles.updateF2 Cycles · contract-only | cycle_archivedWhen status changes to archived (manual), or activation replaces the incumbent (replaced); never for date/field edits or no-op status. | |
| /cycles/:idpage · pendingCycleF2 Cycles | API → cycles.deleteMapping: bound |
cycles.deleteF2 Cycles · contract-only | No emissions declared | |
| /settingspage · pendingSettingsF1 Identity and billing | API → user.getMapping: bound |
user.getF1 Identity and billing · contract-only | No emissions declared | |
| /settingspage · pendingSettingsF1 Identity and billingCross-feature | API → cycles.resolve_activeMapping: bound |
cycles.resolve_activeF2 Cycles · contract-only | cycle_archivedWhen lazy expiry actually archives the active cycle; reason expired. | |
| /settingspage · pendingSettingsF1 Identity and billing | API → billing.get_detailsMapping: bound |
billing.get_detailsF1 Identity and billing · contract-only | No emissions declared | |
| /settingspage · pendingSettingsF1 Identity and billing | API → user.updateMapping: bound |
user.updateF1 Identity and billing · contract-only | profile_updatedWhen at least one editable profile field changes; payload lists changed names only. | |
| /settingspage · pendingSettingsF1 Identity and billing | API → user.deleteMapping: bound |
user.deleteF1 Identity and billing · contract-only | account_deletedIn the successful deletion transaction, before user removal; ON DELETE SET NULL retains the event. Never on failed provider cancellation or replay. | |
| /settingspage · pendingSettingsF1 Identity and billing | API → billing.create_portal_sessionMapping: bound |
billing.create_portal_sessionF1 Identity and billing · contract-only | No emissions declared | |
| /settingspage · pendingSettingsF1 Identity and billing | API → billing.create_checkout_sessionMapping: bound |
billing.create_checkout_sessionF1 Identity and billing · contract-only | No emissions declared | |
| /onboardingpage · pendingSet up your coachingF1 Identity and billing | API → user.getMapping: bound |
user.getF1 Identity and billing · contract-only | No emissions declared | |
| /onboardingpage · pendingSet up your coachingF1 Identity and billing | API → billing.create_checkout_sessionMapping: bound |
billing.create_checkout_sessionF1 Identity and billing · contract-only | No emissions declared | |
| /sign-inpage · liveSign inF1 Identity and billing | — | No service mapping | No emissions declared | No API dependencies declared; local/framework behavior is outside this service map. |
| /sign-uppage · liveSign upF1 Identity and billing | — | No service mapping | No emissions declared | No API dependencies declared; local/framework behavior is outside this service map. |
| /oauth/consentpage · liveAuthorizeF1 Identity and billing | — | No service mapping | No emissions declared | No API dependencies declared; local/framework behavior is outside this service map. |
| result-update-dialoverlay · declaredUpdate Result valueF4 Results | API → results.getMapping: bound |
results.getF4 Results · contract-only | No emissions declared | |
| result-update-dialoverlay · declaredUpdate Result valueF4 Results | API → result_logs.createMapping: bound |
result_logs.createF4 Results · contract-only | result_update_recordedWhen numeric/performance evidence or a milestone flip is saved; not comment-only rows. | |
| result-update-dialoverlay · declaredUpdate Result valueF4 Results | API → habit_logs.setMapping: bound |
habit_logs.setF4 Results · contract-only | result_update_recordedWhen a habit mark/unmark changes recorded progress; not comment-only changes or replay. | |
| note-editoroverlay · declaredCapture or edit a noteF6 Notes | API → notes.getMapping: bound |
notes.getF6 Notes · contract-only | No emissions declared | |
| note-editoroverlay · declaredCapture or edit a noteF6 Notes | API → notes.createMapping: bound |
notes.createF6 Notes · contract-only | note_createdAfter durable creation; not autosave updates or receipt replay. | |
| note-editoroverlay · declaredCapture or edit a noteF6 Notes | API → notes.updateMapping: bound |
notes.updateF6 Notes · contract-only | No emissions declared | |
| note-editoroverlay · declaredCapture or edit a noteF6 Notes | API → notes.deleteMapping: bound |
notes.deleteF6 Notes · contract-only | No emissions declared | |
| cycle_readtool · contract-onlycyclesF2 Cycles | MCP → cycle_read [list]Mapping: bound |
cycles.listF2 Cycles · contract-only | No emissions declared | Tool result → cycle widgetlist or get; skip a missing active cycle.planned · contract-only1 unresolved obligation
|
| cyclewidget · contract-onlyCycleF2 Cycles | MCP → cycle_read [list]Mapping: bound |
cycles.listF2 Cycles · contract-only | No emissions declared | Tool result → cycle widgetlist or get; skip a missing active cycle.planned · contract-onlyWidget receives the tool result; it does not call the service.1 unresolved obligation
|
| cycle_readtool · contract-onlycyclesF2 Cycles | MCP → cycle_read [get]Mapping: bound |
cycles.getF2 Cycles · contract-only cycles.get_stored_activeF2 Cycles · contract-only |
No emissions declared | Tool result → cycle widgetlist or get; skip a missing active cycle.planned · contract-only1 unresolved obligation
|
| cyclewidget · contract-onlyCycleF2 Cycles | MCP → cycle_read [get]Mapping: bound |
cycles.getF2 Cycles · contract-only cycles.get_stored_activeF2 Cycles · contract-only |
No emissions declared | Tool result → cycle widgetlist or get; skip a missing active cycle.planned · contract-onlyWidget receives the tool result; it does not call the service.1 unresolved obligation
|
| cycle_updatetool · contract-onlycyclesF2 Cycles | MCP → cycle_update [call]Mapping: bound |
cycles.updateF2 Cycles · contract-only | cycle_archivedWhen status changes to archived (manual), or activation replaces the incumbent (replaced); never for date/field edits or no-op status. | Tool result → cycle widgetSuccessful date/intention update.planned · contract-only1 unresolved obligation
|
| cyclewidget · contract-onlyCycleF2 Cycles | MCP → cycle_update [call]Mapping: bound |
cycles.updateF2 Cycles · contract-only | cycle_archivedWhen status changes to archived (manual), or activation replaces the incumbent (replaced); never for date/field edits or no-op status. | Tool result → cycle widgetSuccessful date/intention update.planned · contract-onlyWidget receives the tool result; it does not call the service.1 unresolved obligation
|
| cycle_lifecycletool · contract-onlycyclesF2 Cycles | MCP → cycle_lifecycle [create]Mapping: bound |
cycles.createF2 Cycles · contract-only | cycle_createdAfter durable creation; no replay duplicate. cycle_archivedWhen creation replaces an incumbent active cycle; reason replaced. |
Tool result → cycle widgetSuccessful create/archive/activate.planned · contract-only1 unresolved obligation
|
| cyclewidget · contract-onlyCycleF2 Cycles | MCP → cycle_lifecycle [create]Mapping: bound |
cycles.createF2 Cycles · contract-only | cycle_createdAfter durable creation; no replay duplicate. cycle_archivedWhen creation replaces an incumbent active cycle; reason replaced. |
Tool result → cycle widgetSuccessful create/archive/activate.planned · contract-onlyWidget receives the tool result; it does not call the service.1 unresolved obligation
|
| cycle_lifecycletool · contract-onlycyclesF2 Cycles | MCP → cycle_lifecycle [archive]Mapping: bound |
cycles.updateF2 Cycles · contract-only | cycle_archivedWhen status changes to archived (manual), or activation replaces the incumbent (replaced); never for date/field edits or no-op status. | Tool result → cycle widgetSuccessful create/archive/activate.planned · contract-only1 unresolved obligation
|
| cyclewidget · contract-onlyCycleF2 Cycles | MCP → cycle_lifecycle [archive]Mapping: bound |
cycles.updateF2 Cycles · contract-only | cycle_archivedWhen status changes to archived (manual), or activation replaces the incumbent (replaced); never for date/field edits or no-op status. | Tool result → cycle widgetSuccessful create/archive/activate.planned · contract-onlyWidget receives the tool result; it does not call the service.1 unresolved obligation
|
| cycle_lifecycletool · contract-onlycyclesF2 Cycles | MCP → cycle_lifecycle [activate]Mapping: bound |
cycles.updateF2 Cycles · contract-only | cycle_archivedWhen status changes to archived (manual), or activation replaces the incumbent (replaced); never for date/field edits or no-op status. | Tool result → cycle widgetSuccessful create/archive/activate.planned · contract-only1 unresolved obligation
|
| cyclewidget · contract-onlyCycleF2 Cycles | MCP → cycle_lifecycle [activate]Mapping: bound |
cycles.updateF2 Cycles · contract-only | cycle_archivedWhen status changes to archived (manual), or activation replaces the incumbent (replaced); never for date/field edits or no-op status. | Tool result → cycle widgetSuccessful create/archive/activate.planned · contract-onlyWidget receives the tool result; it does not call the service.1 unresolved obligation
|
| cycle_deletetool · contract-onlycyclesF2 Cycles | MCP → cycle_delete [preview]Mapping: bound |
cycles.preview_deletionF2 Cycles · contract-only | No emissions declared | |
| cycle_deletetool · contract-onlycyclesF2 Cycles | MCP → cycle_delete [commit]Mapping: bound |
cycles.deleteF2 Cycles · contract-only | No emissions declared | |
| objective_readtool · contract-onlyobjectivesF3 Objectives | MCP → objective_read [list]Mapping: planned |
objectives.listF3 Objectives · contract-only | No emissions declared | |
| objective_readtool · contract-onlyobjectivesF3 Objectives | MCP → objective_read [get]Mapping: planned |
objectives.getF3 Objectives · contract-only | No emissions declared | Tool result → objective widgetget for an existing objective.planned · contract-only1 unresolved obligation
|
| objectivewidget · contract-onlyObjectiveF3 Objectives | MCP → objective_read [get]Mapping: planned |
objectives.getF3 Objectives · contract-only | No emissions declared | Tool result → objective widgetget for an existing objective.planned · contract-onlyWidget receives the tool result; it does not call the service.1 unresolved obligation
|
| objective_writetool · contract-onlyobjectivesF3 Objectives | MCP → objective_write [create]Mapping: planned |
objectives.createF3 Objectives · contract-only | objective_createdAfter durable creation; no replay duplicate. | Tool result → objective widgetSuccessful create/update.planned · contract-only1 unresolved obligation
|
| objectivewidget · contract-onlyObjectiveF3 Objectives | MCP → objective_write [create]Mapping: planned |
objectives.createF3 Objectives · contract-only | objective_createdAfter durable creation; no replay duplicate. | Tool result → objective widgetSuccessful create/update.planned · contract-onlyWidget receives the tool result; it does not call the service.1 unresolved obligation
|
| objective_writetool · contract-onlyobjectivesF3 Objectives | MCP → objective_write [update]Mapping: planned |
objectives.updateF3 Objectives · contract-only | No emissions declared | Tool result → objective widgetSuccessful create/update.planned · contract-only1 unresolved obligation
|
| objectivewidget · contract-onlyObjectiveF3 Objectives | MCP → objective_write [update]Mapping: planned |
objectives.updateF3 Objectives · contract-only | No emissions declared | Tool result → objective widgetSuccessful create/update.planned · contract-onlyWidget receives the tool result; it does not call the service.1 unresolved obligation
|
| objective_deletetool · contract-onlyobjectivesF3 Objectives | MCP → objective_delete [preview]Mapping: planned |
objectives.preview_deletionF3 Objectives · contract-only | No emissions declared | |
| objective_deletetool · contract-onlyobjectivesF3 Objectives | MCP → objective_delete [commit]Mapping: planned |
objectives.deleteF3 Objectives · contract-only | No emissions declared | |
| result_readtool · contract-onlyresultsF4 Results | MCP → result_read [list]Mapping: planned |
results.listF4 Results · contract-only | No emissions declared | |
| result_readtool · contract-onlyresultsF4 Results | MCP → result_read [get]Mapping: planned |
results.getF4 Results · contract-only | No emissions declared | Tool result → result widgetget for an existing result.planned · contract-only1 unresolved obligation
|
| resultwidget · contract-onlyResultF4 Results | MCP → result_read [get]Mapping: planned |
results.getF4 Results · contract-only | No emissions declared | Tool result → result widgetget for an existing result.planned · contract-onlyWidget receives the tool result; it does not call the service.1 unresolved obligation
|
| result_readtool · contract-onlyresultsF4 Results | MCP → result_read [history]Mapping: planned |
results.historyF4 Results · contract-only | No emissions declared | |
| result_writetool · contract-onlyresultsF4 Results | MCP → result_write [create]Mapping: planned |
results.createF4 Results · contract-only | No emissions declared | Tool result → result widgetSuccessful create/update.planned · contract-only1 unresolved obligation
|
| resultwidget · contract-onlyResultF4 Results | MCP → result_write [create]Mapping: planned |
results.createF4 Results · contract-only | No emissions declared | Tool result → result widgetSuccessful create/update.planned · contract-onlyWidget receives the tool result; it does not call the service.1 unresolved obligation
|
| result_writetool · contract-onlyresultsF4 Results | MCP → result_write [update]Mapping: planned |
results.updateF4 Results · contract-only | No emissions declared | Tool result → result widgetSuccessful create/update.planned · contract-only1 unresolved obligation
|
| resultwidget · contract-onlyResultF4 Results | MCP → result_write [update]Mapping: planned |
results.updateF4 Results · contract-only | No emissions declared | Tool result → result widgetSuccessful create/update.planned · contract-onlyWidget receives the tool result; it does not call the service.1 unresolved obligation
|
| result_deletetool · contract-onlyresultsF4 Results | MCP → result_delete [preview]Mapping: planned |
results.preview_deletionF4 Results · contract-only | No emissions declared | |
| result_deletetool · contract-onlyresultsF4 Results | MCP → result_delete [commit]Mapping: planned |
results.deleteF4 Results · contract-only | No emissions declared | |
| action_readtool · contract-onlyactionsF5 Actions | MCP → action_read [list]Mapping: planned |
actions.listF5 Actions · contract-only | No emissions declared | Tool result → due_actions widgetlist; open actions grouped by objective in stored order.planned · contract-only1 unresolved obligation
|
| due_actionswidget · contract-onlyDue actionsF5 Actions | MCP → action_read [list]Mapping: planned |
actions.listF5 Actions · contract-only | No emissions declared | Tool result → due_actions widgetlist; open actions grouped by objective in stored order.planned · contract-onlyWidget receives the tool result; it does not call the service.1 unresolved obligation
|
| action_readtool · contract-onlyactionsF5 Actions | MCP → action_read [get]Mapping: planned |
actions.getF5 Actions · contract-only | No emissions declared | Tool result → action widgetget for an existing action.planned · contract-only1 unresolved obligation
|
| actionwidget · contract-onlyActionF5 Actions | MCP → action_read [get]Mapping: planned |
actions.getF5 Actions · contract-only | No emissions declared | Tool result → action widgetget for an existing action.planned · contract-onlyWidget receives the tool result; it does not call the service.1 unresolved obligation
|
| action_readtool · contract-onlyactionsF5 Actions | MCP → action_read [history]Mapping: planned |
actions.historyF5 Actions · contract-only | No emissions declared | |
| action_writetool · contract-onlyactionsF5 Actions | MCP → action_write [create]Mapping: planned |
actions.createF5 Actions · contract-only | action_createdAfter durable creation; no replay duplicate. | Tool result → due_actions widgetSuccessful create/update; refreshed open-action snapshot.planned · contract-only Tool result → action widgetSuccessful create/update.planned · contract-only 2 unresolved obligations
|
| due_actionswidget · contract-onlyDue actionsF5 Actions | MCP → action_write [create]Mapping: planned |
actions.createF5 Actions · contract-only | action_createdAfter durable creation; no replay duplicate. | Tool result → due_actions widgetSuccessful create/update; refreshed open-action snapshot.planned · contract-onlyWidget receives the tool result; it does not call the service.1 unresolved obligation
|
| actionwidget · contract-onlyActionF5 Actions | MCP → action_write [create]Mapping: planned |
actions.createF5 Actions · contract-only | action_createdAfter durable creation; no replay duplicate. | Tool result → action widgetSuccessful create/update.planned · contract-onlyWidget receives the tool result; it does not call the service.1 unresolved obligation
|
| action_writetool · contract-onlyactionsF5 Actions | MCP → action_write [update]Mapping: planned |
actions.updateF5 Actions · contract-only | No emissions declared | Tool result → due_actions widgetSuccessful create/update; refreshed open-action snapshot.planned · contract-only Tool result → action widgetSuccessful create/update.planned · contract-only 2 unresolved obligations
|
| due_actionswidget · contract-onlyDue actionsF5 Actions | MCP → action_write [update]Mapping: planned |
actions.updateF5 Actions · contract-only | No emissions declared | Tool result → due_actions widgetSuccessful create/update; refreshed open-action snapshot.planned · contract-onlyWidget receives the tool result; it does not call the service.1 unresolved obligation
|
| actionwidget · contract-onlyActionF5 Actions | MCP → action_write [update]Mapping: planned |
actions.updateF5 Actions · contract-only | No emissions declared | Tool result → action widgetSuccessful create/update.planned · contract-onlyWidget receives the tool result; it does not call the service.1 unresolved obligation
|
| action_deletetool · contract-onlyactionsF5 Actions | MCP → action_delete [preview]Mapping: planned |
actions.preview_deletionF5 Actions · contract-only | No emissions declared | |
| action_deletetool · contract-onlyactionsF5 Actions | MCP → action_delete [commit]Mapping: planned |
actions.deleteF5 Actions · contract-only | No emissions declared | Tool result → due_actions widgetSuccessful commit; remaining open actions only, never the deleted record.planned · contract-only1 unresolved obligation
|
| due_actionswidget · contract-onlyDue actionsF5 Actions | MCP → action_delete [commit]Mapping: planned |
actions.deleteF5 Actions · contract-only | No emissions declared | Tool result → due_actions widgetSuccessful commit; remaining open actions only, never the deleted record.planned · contract-onlyWidget receives the tool result; it does not call the service.1 unresolved obligation
|
| note_readtool · contract-onlynotesF6 Notes | MCP → note_read [list]Mapping: planned |
notes.listF6 Notes · contract-only | No emissions declared | Tool result → notes widgetlist; bounded recent notes with the resolved window.planned · contract-only1 unresolved obligation
|
| noteswidget · contract-onlyNotesF6 Notes | MCP → note_read [list]Mapping: planned |
notes.listF6 Notes · contract-only | No emissions declared | Tool result → notes widgetlist; bounded recent notes with the resolved window.planned · contract-onlyWidget receives the tool result; it does not call the service.1 unresolved obligation
|
| note_readtool · contract-onlynotesF6 Notes | MCP → note_read [get]Mapping: planned |
notes.getF6 Notes · contract-only | No emissions declared | Tool result → note widgetget for an existing note.planned · contract-only1 unresolved obligation
|
| notewidget · contract-onlyNoteF6 Notes | MCP → note_read [get]Mapping: planned |
notes.getF6 Notes · contract-only | No emissions declared | Tool result → note widgetget for an existing note.planned · contract-onlyWidget receives the tool result; it does not call the service.1 unresolved obligation
|
| note_writetool · contract-onlynotesF6 Notes | MCP → note_write [create]Mapping: planned |
notes.createF6 Notes · contract-only | note_createdAfter durable creation; not autosave updates or receipt replay. | Tool result → notes widgetSuccessful create/update; refreshed list.planned · contract-only Tool result → note widgetSuccessful create/update.planned · contract-only 2 unresolved obligations
|
| noteswidget · contract-onlyNotesF6 Notes | MCP → note_write [create]Mapping: planned |
notes.createF6 Notes · contract-only | note_createdAfter durable creation; not autosave updates or receipt replay. | Tool result → notes widgetSuccessful create/update; refreshed list.planned · contract-onlyWidget receives the tool result; it does not call the service.1 unresolved obligation
|
| notewidget · contract-onlyNoteF6 Notes | MCP → note_write [create]Mapping: planned |
notes.createF6 Notes · contract-only | note_createdAfter durable creation; not autosave updates or receipt replay. | Tool result → note widgetSuccessful create/update.planned · contract-onlyWidget receives the tool result; it does not call the service.1 unresolved obligation
|
| note_writetool · contract-onlynotesF6 Notes | MCP → note_write [update]Mapping: planned |
notes.updateF6 Notes · contract-only | No emissions declared | Tool result → notes widgetSuccessful create/update; refreshed list.planned · contract-only Tool result → note widgetSuccessful create/update.planned · contract-only 2 unresolved obligations
|
| noteswidget · contract-onlyNotesF6 Notes | MCP → note_write [update]Mapping: planned |
notes.updateF6 Notes · contract-only | No emissions declared | Tool result → notes widgetSuccessful create/update; refreshed list.planned · contract-onlyWidget receives the tool result; it does not call the service.1 unresolved obligation
|
| notewidget · contract-onlyNoteF6 Notes | MCP → note_write [update]Mapping: planned |
notes.updateF6 Notes · contract-only | No emissions declared | Tool result → note widgetSuccessful create/update.planned · contract-onlyWidget receives the tool result; it does not call the service.1 unresolved obligation
|
| note_deletetool · contract-onlynotesF6 Notes | MCP → note_delete [preview]Mapping: planned |
notes.preview_deletionF6 Notes · contract-only | No emissions declared | |
| note_deletetool · contract-onlynotesF6 Notes | MCP → note_delete [commit]Mapping: planned |
notes.deleteF6 Notes · contract-only | No emissions declared | Tool result → notes widgetSuccessful commit; remaining notes only.planned · contract-only1 unresolved obligation
|
| noteswidget · contract-onlyNotesF6 Notes | MCP → note_delete [commit]Mapping: planned |
notes.deleteF6 Notes · contract-only | No emissions declared | Tool result → notes widgetSuccessful commit; remaining notes only.planned · contract-onlyWidget receives the tool result; it does not call the service.1 unresolved obligation
|
| user_readtool · contract-onlyuserF1 Identity and billing | MCP → user_read [call]Mapping: planned |
user.getF1 Identity and billing · contract-only | No emissions declared | |
| user_updatetool · contract-onlyuserF1 Identity and billing | MCP → user_update [call]Mapping: planned |
user.updateF1 Identity and billing · contract-only | profile_updatedWhen at least one editable profile field changes; payload lists changed names only. | |
| session_readtool · contract-onlysessionsF7 Sessions | MCP → session_read [list]Mapping: planned |
sessions.listF7 Sessions · contract-only | No emissions declared | Tool result → session widgetlist or get for a stored session; skip missing-session results.planned · contract-only1 unresolved obligation
|
| sessionwidget · contract-onlySessionF7 Sessions | MCP → session_read [list]Mapping: planned |
sessions.listF7 Sessions · contract-only | No emissions declared | Tool result → session widgetlist or get for a stored session; skip missing-session results.planned · contract-onlyWidget receives the tool result; it does not call the service.1 unresolved obligation
|
| session_readtool · contract-onlysessionsF7 Sessions | MCP → session_read [get]Mapping: planned |
sessions.get_storedF7 Sessions · contract-only | No emissions declared | Tool result → session widgetlist or get for a stored session; skip missing-session results.planned · contract-only Tool result → session_document widgetget with a selected stored briefing or summary document.planned · contract-only 2 unresolved obligations
|
| sessionwidget · contract-onlySessionF7 Sessions | MCP → session_read [get]Mapping: planned |
sessions.get_storedF7 Sessions · contract-only | No emissions declared | Tool result → session widgetlist or get for a stored session; skip missing-session results.planned · contract-onlyWidget receives the tool result; it does not call the service.1 unresolved obligation
|
| session_documentwidget · contract-onlySession documentF7 Sessions | MCP → session_read [get]Mapping: planned |
sessions.get_storedF7 Sessions · contract-only | No emissions declared | Tool result → session_document widgetget with a selected stored briefing or summary document.planned · contract-onlyWidget receives the tool result; it does not call the service.1 unresolved obligation
|
| session_starttool · contract-onlysessionsF7 SessionsCross-feature | MCP → session_start [call]Mapping: planned |
sessions.startF7 Sessions · contract-only | session_startedOnly when a new session is persisted; not existing-session reuse. | Tool result → progress widgetActive access only; render the current cycle and objectives/results snapshot.planned · contract-only Tool result → session_document widgetActive access only; saved briefing document.planned · contract-only 2 unresolved obligations
|
| coaching_sessionprompt · unavailableCoaching sessionCross-feature | MCP → session_start [call]Mapping: planned |
sessions.startF7 Sessions · contract-only | session_startedOnly when a new session is persisted; not existing-session reuse. | Tool result → progress widgetActive access only; render the current cycle and objectives/results snapshot.planned · contract-only Tool result → session_document widgetActive access only; saved briefing document.planned · contract-onlyRequired capability; declaration does not prescribe execution order. 2 unresolved obligations
|
| progresswidget · contract-onlyProgressF3 ObjectivesCross-feature | MCP → session_start [call]Mapping: planned |
sessions.startF7 Sessions · contract-only | session_startedOnly when a new session is persisted; not existing-session reuse. | Tool result → progress widgetActive access only; render the current cycle and objectives/results snapshot.planned · contract-onlyWidget receives the tool result; it does not call the service.1 unresolved obligation
|
| session_documentwidget · contract-onlySession documentF7 Sessions | MCP → session_start [call]Mapping: planned |
sessions.startF7 Sessions · contract-only | session_startedOnly when a new session is persisted; not existing-session reuse. | Tool result → session_document widgetActive access only; saved briefing document.planned · contract-onlyWidget receives the tool result; it does not call the service.1 unresolved obligation
|
| session_closetool · contract-onlysessionsF7 Sessions | MCP → session_close [call]Mapping: planned |
sessions.closeF7 Sessions · contract-only | session_summary_writtenOn the first successful close with summary; not replay or forced stale close. | Tool result → session widgetSuccessful explicit closure; show the saved summary and session actions.planned · contract-only1 unresolved obligation
|
| coaching_sessionprompt · unavailableCoaching session | MCP → session_close [call]Mapping: planned |
sessions.closeF7 Sessions · contract-only | session_summary_writtenOn the first successful close with summary; not replay or forced stale close. | Tool result → session widgetSuccessful explicit closure; show the saved summary and session actions.planned · contract-onlyRequired capability; declaration does not prescribe execution order.1 unresolved obligation
|
| sessionwidget · contract-onlySessionF7 Sessions | MCP → session_close [call]Mapping: planned |
sessions.closeF7 Sessions · contract-only | session_summary_writtenOn the first successful close with summary; not replay or forced stale close. | Tool result → session widgetSuccessful explicit closure; show the saved summary and session actions.planned · contract-onlyWidget receives the tool result; it does not call the service.1 unresolved obligation
|
| progress_recordtool · contract-onlyprogressF4 Results | MCP → progress_record [result]Mapping: planned |
result_logs.createF4 Results · contract-only | result_update_recordedWhen numeric/performance evidence or a milestone flip is saved; not comment-only rows. | Tool result → result widgetSuccessful result or habit evidence entry.planned · contract-only1 unresolved obligation
|
| resultwidget · contract-onlyResultF4 Results | MCP → progress_record [result]Mapping: planned |
result_logs.createF4 Results · contract-only | result_update_recordedWhen numeric/performance evidence or a milestone flip is saved; not comment-only rows. | Tool result → result widgetSuccessful result or habit evidence entry.planned · contract-onlyWidget receives the tool result; it does not call the service.1 unresolved obligation
|
| progress_recordtool · contract-onlyprogressF4 Results | MCP → progress_record [habit]Mapping: planned |
habit_logs.setF4 Results · contract-only | result_update_recordedWhen a habit mark/unmark changes recorded progress; not comment-only changes or replay. | Tool result → result widgetSuccessful result or habit evidence entry.planned · contract-only1 unresolved obligation
|
| resultwidget · contract-onlyResultF4 Results | MCP → progress_record [habit]Mapping: planned |
habit_logs.setF4 Results · contract-only | result_update_recordedWhen a habit mark/unmark changes recorded progress; not comment-only changes or replay. | Tool result → result widgetSuccessful result or habit evidence entry.planned · contract-onlyWidget receives the tool result; it does not call the service.1 unresolved obligation
|
| progress_recordtool · contract-onlyprogressF4 ResultsCross-feature | MCP → progress_record [action]Mapping: planned |
action_logs.createF5 Actions · contract-only | action_status_changedFor each persisted log, including repeat status with comment; not receipt replay. | Tool result → due_actions widgetSuccessful action evidence entry; refreshed open-action snapshot.planned · contract-only1 unresolved obligation
|
| due_actionswidget · contract-onlyDue actionsF5 Actions | MCP → progress_record [action]Mapping: planned |
action_logs.createF5 Actions · contract-only | action_status_changedFor each persisted log, including repeat status with comment; not receipt replay. | Tool result → due_actions widgetSuccessful action evidence entry; refreshed open-action snapshot.planned · contract-onlyWidget receives the tool result; it does not call the service.1 unresolved obligation
|
| example_listtool · implementedRetained scaffoldTemporary scaffold reference | MCP → example_list [call] |
No service mapping | No emissions declared | Retained scaffold; no product service descriptor is declared. |
| examplewidget · implementedExampleTemporary scaffold reference | MCP → example_list [call] |
No service mapping | No emissions declared | Tool result → example widgetSuccessful list.bound · implementedRetained scaffold; no product service descriptor is declared. |
| example_createtool · implementedRetained scaffoldTemporary scaffold reference | MCP → example_create [call] |
No service mapping | No emissions declared | Retained scaffold; no product service descriptor is declared. |
| cycles.preview_deletionapi · declaredNo declared page or overlay consumer | API → cycles.preview_deletionMapping: bound |
cycles.preview_deletionF2 Cycles · contract-only | No emissions declared | |
| objectives.preview_deletionapi · declaredNo declared page or overlay consumer | API → objectives.preview_deletionMapping: bound |
objectives.preview_deletionF3 Objectives · contract-only | No emissions declared | |
| objectives.listapi · declaredNo declared page or overlay consumer | API → objectives.listMapping: bound |
objectives.listF3 Objectives · contract-only | No emissions declared | |
| results.preview_deletionapi · declaredNo declared page or overlay consumer | API → results.preview_deletionMapping: bound |
results.preview_deletionF4 Results · contract-only | No emissions declared | |
| results.listapi · declaredNo declared page or overlay consumer | API → results.listMapping: bound |
results.listF4 Results · contract-only | No emissions declared | |
| actions.preview_deletionapi · declaredNo declared page or overlay consumer | API → actions.preview_deletionMapping: bound |
actions.preview_deletionF5 Actions · contract-only | No emissions declared | |
| notes.preview_deletionapi · declaredNo declared page or overlay consumer | API → notes.preview_deletionMapping: bound |
notes.preview_deletionF6 Notes · contract-only | No emissions declared | |
| sessions.startapi · declaredNo declared page or overlay consumer | API → sessions.startMapping: bound |
sessions.startF7 Sessions · contract-only | session_startedOnly when a new session is persisted; not existing-session reuse. | |
| sessions.closeapi · declaredNo declared page or overlay consumer | API → sessions.closeMapping: bound |
sessions.closeF7 Sessions · contract-only | session_summary_writtenOn the first successful close with summary; not replay or forced stale close. | |
| chat_tool_usedexternal-event · declaredMCP tool call outcome; no stored coaching content.F7 Sessions | — | No service mapping | chat_tool_used | External producers: mcp-boundary — packages/core/src/shared/mcp/index.ts: For a tool call with an authenticated actor; both success and failure outcomes.1 unresolved obligation
|
| account_createdexternal-event · declaredDurable account creation; user_id matches the canonical user UUID.F1 Identity and billing | — | No service mapping | account_created | External producers: auth-hook — packages/core/src/shared/auth/server.ts: After a newly persisted account. |
| subscription_startedexternal-event · declaredFirst transition to active paid access.F1 Identity and billing | — | No service mapping | subscription_started | External producers: billing-webhook — packages/core/src/features/identity-billing/handler.ts: On the first verified transition to active; not checkout URL creation. |
| subscription_cancelledexternal-event · declaredOnce per scheduled or immediate cancellation; no duplicate webhook delivery.F1 Identity and billing | — | No service mapping | subscription_cancelled | External producers: billing-webhook — packages/core/src/features/identity-billing/handler.ts: On a newly applied scheduled or immediate cancellation, not a duplicate delivery. |
| connector_authorisedexternal-event · declaredNew durable connector consent; not a replay.F1 Identity and billing | — | No service mapping | connector_authorised | External producers: auth-hook — packages/core/src/shared/auth/server.ts: After new connector consent is persisted. |
| onboarding_step_completedexternal-event · declaredVerified onboarding step completion; never inferred from a redirect alone.F1 Identity and billing | — | No service mapping | onboarding_step_completed | External producers: page — packages/core/src/features/identity-billing/onboarding.page.tsx: After verified step completion; no new public event API is authorized.1 unresolved obligation
|
| example_createdexternal-event · declaredRetained scaffold: one event per fresh example write in the same transaction.packages/core/src/features/example/docs.md | — | No service mapping | example_created | No service or external producer declared. |
No matching declared paths.
{
"source": "packages/core/src/contracts/schema.ts",
"ontology": "docs/ONTOLOGY.md",
"relationship": "Each service declares the tables it touches (`tables`); names are checked against this schema by a contract test. Declarations are design obligations, not enforced access."
}[
{
"name": "coaching_session",
"title": "Coaching session",
"description": "Open a flexible coaching session: adapt to goal setup, check-in, review or open coaching within one session.",
"requiredTools": [
"session_start",
"session_close"
],
"available": false
}
][
{
"path": "/terms",
"title": "Terms",
"owner": "Scaffold legal-route continuity",
"implementation": "scaffold",
"overlays": [],
"reads": [],
"writes": [],
"services": []
},
{
"path": "/privacy",
"title": "Privacy",
"owner": "Scaffold legal-route continuity",
"implementation": "scaffold",
"overlays": [],
"reads": [],
"writes": [],
"services": []
},
{
"path": "/cookies",
"title": "Cookies",
"owner": "Scaffold legal-route continuity",
"implementation": "scaffold",
"overlays": [],
"reads": [],
"writes": [],
"services": []
},
{
"path": "/example",
"title": "Example",
"owner": "Temporary scaffold reference",
"implementation": "scaffold",
"overlays": [],
"reads": [
"example.list"
],
"writes": [
"example.create",
"example.delete"
],
"services": []
},
{
"path": "/",
"title": "Objectives",
"owner": "F3 Objectives",
"implementation": "pending",
"overlays": [
"result-update-dial",
"note-editor"
],
"reads": [
"record.query"
],
"writes": [
"objectives.create"
],
"services": [
"record.query",
"objectives.create"
]
},
{
"path": "/objectives/:id",
"title": "Objective",
"owner": "F3 Objectives",
"implementation": "pending",
"overlays": [
"result-update-dial"
],
"reads": [
"objectives.get"
],
"writes": [
"objectives.create",
"objectives.update",
"objectives.delete",
"results.create",
"actions.create",
"action_logs.create"
],
"services": [
"objectives.get",
"objectives.create",
"objectives.update",
"objectives.delete",
"results.create",
"actions.create",
"action_logs.create"
]
},
{
"path": "/results/:id",
"title": "Result",
"owner": "F4 Results",
"implementation": "pending",
"overlays": [
"result-update-dial"
],
"reads": [
"results.get",
"result_logs.list",
"habit_logs.list"
],
"writes": [
"results.create",
"results.update",
"results.delete",
"result_logs.create",
"result_logs.clear_comment",
"result_logs.delete",
"habit_logs.set"
],
"services": [
"results.get",
"result_logs.list",
"habit_logs.list",
"results.create",
"results.update",
"results.delete",
"result_logs.create",
"result_logs.clear_comment",
"result_logs.delete",
"habit_logs.set"
]
},
{
"path": "/actions",
"title": "Actions",
"owner": "F5 Actions",
"implementation": "pending",
"overlays": [],
"reads": [
"actions.list"
],
"writes": [
"actions.create",
"actions.reorder",
"action_logs.create"
],
"services": [
"actions.list",
"actions.create",
"actions.reorder",
"action_logs.create"
]
},
{
"path": "/actions/:id",
"title": "Action",
"owner": "F5 Actions",
"implementation": "pending",
"overlays": [],
"reads": [
"actions.get",
"action_logs.list"
],
"writes": [
"actions.create",
"actions.update",
"actions.delete",
"action_logs.create",
"action_logs.clear_comment"
],
"services": [
"actions.get",
"action_logs.list",
"actions.create",
"actions.update",
"actions.delete",
"action_logs.create",
"action_logs.clear_comment"
]
},
{
"path": "/notes",
"title": "Notes",
"owner": "F6 Notes",
"implementation": "pending",
"overlays": [
"note-editor"
],
"reads": [
"notes.list"
],
"writes": [
"notes.delete"
],
"services": [
"notes.list",
"notes.delete"
]
},
{
"path": "/notes/:id",
"title": "Note",
"owner": "F6 Notes",
"implementation": "pending",
"overlays": [],
"reads": [
"notes.get"
],
"writes": [
"notes.update",
"notes.delete"
],
"services": [
"notes.get",
"notes.update",
"notes.delete"
]
},
{
"path": "/sessions",
"title": "Sessions",
"owner": "F7 Sessions",
"implementation": "pending",
"overlays": [],
"reads": [
"sessions.list"
],
"writes": [],
"services": [
"sessions.list"
]
},
{
"path": "/sessions/:id",
"title": "Session",
"owner": "F7 Sessions",
"implementation": "pending",
"overlays": [],
"reads": [
"sessions.get"
],
"writes": [
"action_logs.create"
],
"services": [
"sessions.get",
"action_logs.create"
]
},
{
"path": "/sessions/:id/briefing",
"title": "Briefing",
"owner": "F7 Sessions",
"implementation": "pending",
"overlays": [],
"reads": [
"sessions.get"
],
"writes": [],
"services": [
"sessions.get"
]
},
{
"path": "/sessions/:id/summary",
"title": "Session summary",
"owner": "F7 Sessions",
"implementation": "pending",
"overlays": [],
"reads": [
"sessions.get"
],
"writes": [],
"services": [
"sessions.get"
]
},
{
"path": "/cycles",
"title": "Cycles",
"owner": "F2 Cycles",
"implementation": "pending",
"overlays": [],
"reads": [
"cycles.list"
],
"writes": [],
"services": [
"cycles.list"
]
},
{
"path": "/cycles/new",
"title": "Set up a cycle",
"owner": "F2 Cycles",
"implementation": "pending",
"overlays": [],
"reads": [],
"writes": [
"cycles.create"
],
"services": [
"cycles.create"
]
},
{
"path": "/cycles/:id",
"title": "Cycle",
"owner": "F2 Cycles",
"implementation": "pending",
"overlays": [],
"reads": [
"cycles.get"
],
"writes": [
"cycles.update",
"cycles.delete"
],
"services": [
"cycles.get",
"cycles.update",
"cycles.delete"
]
},
{
"path": "/settings",
"title": "Settings",
"owner": "F1 Identity and billing",
"implementation": "pending",
"overlays": [],
"reads": [
"user.get",
"cycles.resolve_active",
"billing.get_details"
],
"writes": [
"user.update",
"user.delete",
"billing.create_portal_session",
"billing.create_checkout_session"
],
"services": [
"user.get",
"cycles.resolve_active",
"billing.get_details",
"user.update",
"user.delete",
"billing.create_portal_session",
"billing.create_checkout_session"
]
},
{
"path": "/onboarding",
"title": "Set up your coaching",
"owner": "F1 Identity and billing",
"implementation": "pending",
"overlays": [],
"reads": [
"user.get"
],
"writes": [
"billing.create_checkout_session"
],
"services": [
"user.get",
"billing.create_checkout_session"
]
},
{
"path": "/sign-in",
"title": "Sign in",
"owner": "F1 Identity and billing",
"implementation": "live",
"overlays": [],
"reads": [],
"writes": [],
"services": []
},
{
"path": "/sign-up",
"title": "Sign up",
"owner": "F1 Identity and billing",
"implementation": "live",
"overlays": [],
"reads": [],
"writes": [],
"services": []
},
{
"path": "/oauth/consent",
"title": "Authorize",
"owner": "F1 Identity and billing",
"implementation": "live",
"overlays": [],
"reads": [],
"writes": [],
"services": []
}
][
{
"name": "result-update-dial",
"title": "Update Result value",
"owner": "F4 Results",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"required": [
"result_id"
],
"additionalProperties": false
},
"procedures": [
"results.get",
"result_logs.create",
"habit_logs.set"
],
"services": [
"results.get",
"result_logs.create",
"habit_logs.set"
],
"opened_by": [
"/",
"/objectives/:id",
"/results/:id"
]
},
{
"name": "note-editor",
"title": "Capture or edit a note",
"owner": "F6 Notes",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"mode": {
"type": "string",
"const": "create"
}
},
"required": [
"mode"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"mode": {
"type": "string",
"const": "edit"
},
"note_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"required": [
"mode",
"note_id"
],
"additionalProperties": false
}
]
},
"procedures": [
"notes.get",
"notes.create",
"notes.update",
"notes.delete"
],
"services": [
"notes.get",
"notes.create",
"notes.update",
"notes.delete"
],
"opened_by": [
"/",
"/notes"
]
}
][
{
"id": "progress",
"title": "Progress",
"owner": "F3 Objectives",
"kind": "product",
"pages": [
"/"
],
"resource_uri": "ui://widget/progress.v1.html",
"payload": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"as_of": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
"description": "Server snapshot time for the stale-snapshot footer."
},
"data": {
"anyOf": [
{
"type": "object",
"properties": {
"as_of": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"boundary": {
"type": "object",
"properties": {
"at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"source": {
"type": "string",
"enum": [
"session",
"cycle_start",
"none"
]
}
},
"required": [
"at",
"session_id",
"source"
],
"additionalProperties": false
},
"cycle": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"cycle_line": {
"anyOf": [
{
"type": "object",
"properties": {
"range": {
"type": "string"
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100
}
},
"required": [
"range",
"time_gone_pct"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"objectives": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Deadline; null when no deadline has been set."
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Progress. Derived from measurable results, independently of Status."
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Historical progress at the resolved last-session boundary; not current Progress."
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"cycle_id",
"title",
"description",
"deadline_at",
"status",
"created_at",
"short_code",
"url",
"progress_pct",
"boundary_progress_pct",
"movement_pp"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"results": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"boundary_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 1
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"boundary_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Start. Metric baseline; habit baselines are derived rather than stored."
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
}
]
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"as_of",
"boundary",
"cycle",
"cycle_line",
"objectives",
"results",
"continuations"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"totals": {
"type": "object",
"properties": {
"objectives": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"results": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"objectives",
"results"
],
"additionalProperties": false
}
},
"required": [
"as_of",
"data",
"totals"
],
"additionalProperties": false
},
"readiness": "contract-only",
"binding": "planned",
"gap": "Project the active briefing into the dashboard payload; no coaching card for unpaid access.",
"sources": [
{
"tool": "session_start",
"operations": [
"call"
],
"when": "Active access only; render the current cycle and objectives/results snapshot.",
"services": [
"sessions.start"
]
}
]
},
{
"id": "objective",
"title": "Objective",
"owner": "F3 Objectives",
"kind": "product",
"pages": [
"/objectives/:id"
],
"resource_uri": "ui://widget/objective.v1.html",
"payload": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"as_of": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
"description": "Server snapshot time for the stale-snapshot footer."
},
"data": {
"anyOf": [
{
"type": "object",
"properties": {
"objective": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Deadline; null when no deadline has been set."
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Progress. Derived from measurable results, independently of Status."
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Historical progress at the resolved last-session boundary; not current Progress."
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"cycle_id",
"title",
"description",
"deadline_at",
"status",
"created_at",
"short_code",
"url",
"progress_pct",
"boundary_progress_pct",
"movement_pp"
],
"additionalProperties": false
},
"cycle": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
},
"results": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"boundary_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 1
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"boundary_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Start. Metric baseline; habit baselines are derived rather than stored."
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
}
]
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"actions": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Due. May be unset on a web draft; a set date cannot be cleared."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"sort_order": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Drag order within an action group; not a progress status."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"overdue": {
"type": "boolean"
},
"done_since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"cycle_id",
"objective_id",
"title",
"description",
"due_at",
"status",
"sort_order",
"session_id",
"created_at",
"url",
"overdue",
"done_since_boundary"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"objective",
"cycle",
"results",
"actions",
"continuations"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"totals": {
"type": "object",
"properties": {
"results": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"actions": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"results",
"actions"
],
"additionalProperties": false
}
},
"required": [
"as_of",
"data",
"totals"
],
"additionalProperties": false
},
"readiness": "contract-only",
"binding": "planned",
"gap": "Compact MCP records omit cycle, results and actions required by the page-mirroring payload.",
"sources": [
{
"tool": "objective_read",
"operations": [
"get"
],
"when": "get for an existing objective.",
"services": [
"objectives.get"
]
},
{
"tool": "objective_write",
"operations": [
"create",
"update"
],
"when": "Successful create/update.",
"services": [
"objectives.create",
"objectives.update"
]
}
]
},
{
"id": "result",
"title": "Result",
"owner": "F4 Results",
"kind": "product",
"pages": [
"/results/:id"
],
"resource_uri": "ui://widget/result.v1.html",
"payload": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"as_of": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
"description": "Server snapshot time for the stale-snapshot footer."
},
"data": {
"anyOf": [
{
"type": "object",
"properties": {
"result": {
"oneOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"boundary_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 1
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"boundary_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Start. Metric baseline; habit baselines are derived rather than stored."
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
}
]
},
"parents": {
"type": "object",
"properties": {
"cycle": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"objectives": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Deadline; null when no deadline has been set."
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Progress. Derived from measurable results, independently of Status."
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Historical progress at the resolved last-session boundary; not current Progress."
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"cycle_id",
"title",
"description",
"deadline_at",
"status",
"created_at",
"short_code",
"url",
"progress_pct",
"boundary_progress_pct",
"movement_pp"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
}
},
"required": [
"cycle",
"objectives"
],
"additionalProperties": false
},
"result_logs": {
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"comment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"result_id",
"value",
"comment",
"session_id",
"recorded_at"
],
"additionalProperties": false,
"description": "Result log stored in result_logs. The UI shows value entries under Updates and their non-empty comments under Comments. Value may be null for a comment-only habit entry; evidence and timestamps are immutable."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"habit_logs": {
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"day": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"result_id",
"day",
"session_id",
"created_at"
],
"additionalProperties": false,
"description": "Habit log stored in habit_logs. The UI marks calendar days and lists them under Updates with the Marked column. One row per result/day; unmarking deletes the row. This is not append-only history."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"trend": {
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "value"
},
"at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"value": {
"type": "number"
},
"pace": {
"type": "number"
}
},
"required": [
"kind",
"at",
"value",
"pace"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "habit"
},
"from": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"to": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"actual": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"expected": {
"type": "number"
},
"expected_full": {
"type": "number"
}
},
"required": [
"kind",
"from",
"to",
"actual",
"expected",
"expected_full"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "performance"
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"value": {
"type": "number"
},
"target": {
"type": "number"
},
"gap": {
"type": "number"
},
"share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"kind",
"id",
"at",
"value",
"target",
"gap",
"share"
],
"additionalProperties": false
}
]
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"result",
"parents",
"result_logs",
"habit_logs",
"trend",
"continuations"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"totals": {
"type": "object",
"properties": {
"objectives": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"result_logs": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"habit_logs": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"trend": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"objectives",
"result_logs",
"habit_logs",
"trend"
],
"additionalProperties": false
}
},
"required": [
"as_of",
"data",
"totals"
],
"additionalProperties": false
},
"readiness": "contract-only",
"binding": "planned",
"gap": "Supply bounded parent figures, trend and evidence alongside the compact MCP result.",
"sources": [
{
"tool": "result_read",
"operations": [
"get"
],
"when": "get for an existing result.",
"services": [
"results.get"
]
},
{
"tool": "result_write",
"operations": [
"create",
"update"
],
"when": "Successful create/update.",
"services": [
"results.create",
"results.update"
]
},
{
"tool": "progress_record",
"operations": [
"result",
"habit"
],
"when": "Successful result or habit evidence entry.",
"services": [
"result_logs.create",
"habit_logs.set"
]
}
]
},
{
"id": "due_actions",
"title": "Due actions",
"owner": "F5 Actions",
"kind": "product",
"pages": [
"/actions"
],
"resource_uri": "ui://widget/due-actions.v1.html",
"payload": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"as_of": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
"description": "Server snapshot time for the stale-snapshot footer."
},
"data": {
"anyOf": [
{
"type": "object",
"properties": {
"cycle": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"cycle_line": {
"anyOf": [
{
"type": "object",
"properties": {
"range": {
"type": "string"
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100
}
},
"required": [
"range",
"time_gone_pct"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"objectives": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Deadline; null when no deadline has been set."
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Progress. Derived from measurable results, independently of Status."
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Historical progress at the resolved last-session boundary; not current Progress."
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"cycle_id",
"title",
"description",
"deadline_at",
"status",
"created_at",
"short_code",
"url",
"progress_pct",
"boundary_progress_pct",
"movement_pp"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"actions": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Due. May be unset on a web draft; a set date cannot be cleared."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"sort_order": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Drag order within an action group; not a progress status."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"overdue": {
"type": "boolean"
},
"done_since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"cycle_id",
"objective_id",
"title",
"description",
"due_at",
"status",
"sort_order",
"session_id",
"created_at",
"url",
"overdue",
"done_since_boundary"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"cycle",
"cycle_line",
"objectives",
"actions",
"continuations"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"totals": {
"type": "object",
"properties": {
"objectives": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"actions": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"objectives",
"actions"
],
"additionalProperties": false
}
},
"required": [
"as_of",
"data",
"totals"
],
"additionalProperties": false
},
"readiness": "contract-only",
"binding": "planned",
"gap": "Compose the cycle, objective grouping and remaining open actions server-side; a mutation receipt alone is insufficient.",
"sources": [
{
"tool": "action_read",
"operations": [
"list"
],
"when": "list; open actions grouped by objective in stored order.",
"services": [
"actions.list"
]
},
{
"tool": "action_write",
"operations": [
"create",
"update"
],
"when": "Successful create/update; refreshed open-action snapshot.",
"services": [
"actions.create",
"actions.update"
]
},
{
"tool": "action_delete",
"operations": [
"commit"
],
"when": "Successful commit; remaining open actions only, never the deleted record.",
"services": [
"actions.delete"
]
},
{
"tool": "progress_record",
"operations": [
"action"
],
"when": "Successful action evidence entry; refreshed open-action snapshot.",
"services": [
"action_logs.create"
]
}
]
},
{
"id": "action",
"title": "Action",
"owner": "F5 Actions",
"kind": "product",
"pages": [
"/actions/:id"
],
"resource_uri": "ui://widget/action.v1.html",
"payload": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"as_of": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
"description": "Server snapshot time for the stale-snapshot footer."
},
"data": {
"anyOf": [
{
"type": "object",
"properties": {
"action": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Due. May be unset on a web draft; a set date cannot be cleared."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"sort_order": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Drag order within an action group; not a progress status."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"overdue": {
"type": "boolean"
},
"done_since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"cycle_id",
"objective_id",
"title",
"description",
"due_at",
"status",
"sort_order",
"session_id",
"created_at",
"url",
"overdue",
"done_since_boundary"
],
"additionalProperties": false
},
"cycle": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
},
"objective": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Deadline; null when no deadline has been set."
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Progress. Derived from measurable results, independently of Status."
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Historical progress at the resolved last-session boundary; not current Progress."
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"cycle_id",
"title",
"description",
"deadline_at",
"status",
"created_at",
"short_code",
"url",
"progress_pct",
"boundary_progress_pct",
"movement_pp"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"source_session": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"vendor": {
"type": "string",
"enum": [
"claude",
"openai"
],
"description": "Conversation host: claude is shown as Claude; openai is shown as ChatGPT."
},
"source_url": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "External conversation link used by Open the conversation. Not the app detail URL."
},
"type": {
"anyOf": [
{
"type": "string",
"enum": [
"goal_setup",
"check_in",
"review",
"open_coaching"
],
"description": "Coaching session type: Goal setup, Check-in, Review or Open coaching. Separate from whether the session is still open."
},
{
"type": "null"
}
]
},
"briefing_notes": {
"type": "string",
"description": "UI document: Briefing. Server-prepared coaching context."
},
"headline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "One-line coaching-session summary used in session lists."
},
"summary_notes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI document: Summary. Saved when the coaching session closes."
},
"started_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"ended_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
],
"description": "Closed when set; In progress when null. This is derived session state, not a stored status enum."
},
"url": {
"type": "string",
"format": "uri",
"description": "Internal app link to coaching session details; distinct from source_url."
},
"duration_minutes": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"actions_created": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"actions_reviewed": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"id",
"vendor",
"source_url",
"type",
"briefing_notes",
"headline",
"summary_notes",
"started_at",
"ended_at",
"url",
"duration_minutes",
"actions_created",
"actions_reviewed"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"action_logs": {
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"action_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"comment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"action_id",
"status",
"comment",
"session_id",
"recorded_at"
],
"additionalProperties": false,
"description": "Action log stored in action_logs. Records a status observation and optional comment. Action detail shows Comments, a filtered view rather than the complete status history; status and timestamps are immutable, and only the comment may be cleared."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"action",
"cycle",
"objective",
"source_session",
"action_logs",
"continuations"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"totals": {
"type": "object",
"properties": {
"action_logs": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"action_logs"
],
"additionalProperties": false
}
},
"required": [
"as_of",
"data",
"totals"
],
"additionalProperties": false
},
"readiness": "contract-only",
"binding": "planned",
"gap": "Supply parent labels and bounded action history alongside the compact MCP action.",
"sources": [
{
"tool": "action_read",
"operations": [
"get"
],
"when": "get for an existing action.",
"services": [
"actions.get"
]
},
{
"tool": "action_write",
"operations": [
"create",
"update"
],
"when": "Successful create/update.",
"services": [
"actions.create",
"actions.update"
]
}
]
},
{
"id": "notes",
"title": "Notes",
"owner": "F6 Notes",
"kind": "product",
"pages": [
"/notes"
],
"resource_uri": "ui://widget/notes.v1.html",
"payload": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"as_of": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
"description": "Server snapshot time for the stale-snapshot footer."
},
"data": {
"anyOf": [
{
"type": "object",
"properties": {
"items": {
"maxItems": 3,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"text": {
"type": "string",
"minLength": 1
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"text",
"recorded_at",
"url",
"since_boundary"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"window": {
"anyOf": [
{
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor",
"window"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"totals": {
"type": "object",
"properties": {
"notes": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"notes"
],
"additionalProperties": false
}
},
"required": [
"as_of",
"data",
"totals"
],
"additionalProperties": false
},
"readiness": "contract-only",
"binding": "planned",
"gap": "Project list responses and obtain the bounded refreshed list after a mutation; never repeat writes for pagination.",
"sources": [
{
"tool": "note_read",
"operations": [
"list"
],
"when": "list; bounded recent notes with the resolved window.",
"services": [
"notes.list"
]
},
{
"tool": "note_write",
"operations": [
"create",
"update"
],
"when": "Successful create/update; refreshed list.",
"services": [
"notes.create",
"notes.update"
]
},
{
"tool": "note_delete",
"operations": [
"commit"
],
"when": "Successful commit; remaining notes only.",
"services": [
"notes.delete"
]
}
]
},
{
"id": "note",
"title": "Note",
"owner": "F6 Notes",
"kind": "product",
"pages": [
"/notes/:id"
],
"resource_uri": "ui://widget/note.v1.html",
"payload": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"as_of": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
"description": "Server snapshot time for the stale-snapshot footer."
},
"data": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"text": {
"type": "string",
"minLength": 1
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"text",
"recorded_at",
"url",
"since_boundary"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"totals": {
"type": "object",
"properties": {},
"additionalProperties": false
}
},
"required": [
"as_of",
"data",
"totals"
],
"additionalProperties": false
},
"readiness": "contract-only",
"binding": "planned",
"gap": "Bind the note field from structuredContent to the declared payload; stored text stays untrusted.",
"sources": [
{
"tool": "note_read",
"operations": [
"get"
],
"when": "get for an existing note.",
"services": [
"notes.get"
]
},
{
"tool": "note_write",
"operations": [
"create",
"update"
],
"when": "Successful create/update.",
"services": [
"notes.create",
"notes.update"
]
}
]
},
{
"id": "session",
"title": "Session",
"owner": "F7 Sessions",
"kind": "product",
"pages": [
"/sessions",
"/sessions/:id"
],
"resource_uri": "ui://widget/session.v1.html",
"payload": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"anyOf": [
{
"type": "object",
"properties": {
"as_of": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
"description": "Server snapshot time for the stale-snapshot footer."
},
"data": {
"anyOf": [
{
"type": "object",
"properties": {
"session": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"vendor": {
"type": "string",
"enum": [
"claude",
"openai"
],
"description": "Conversation host: claude is shown as Claude; openai is shown as ChatGPT."
},
"source_url": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "External conversation link used by Open the conversation. Not the app detail URL."
},
"type": {
"anyOf": [
{
"type": "string",
"enum": [
"goal_setup",
"check_in",
"review",
"open_coaching"
],
"description": "Coaching session type: Goal setup, Check-in, Review or Open coaching. Separate from whether the session is still open."
},
{
"type": "null"
}
]
},
"briefing_notes": {
"type": "string",
"description": "UI document: Briefing. Server-prepared coaching context."
},
"headline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "One-line coaching-session summary used in session lists."
},
"summary_notes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI document: Summary. Saved when the coaching session closes."
},
"started_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"ended_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
],
"description": "Closed when set; In progress when null. This is derived session state, not a stored status enum."
},
"url": {
"type": "string",
"format": "uri",
"description": "Internal app link to coaching session details; distinct from source_url."
},
"duration_minutes": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"actions_created": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"actions_reviewed": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"id",
"vendor",
"source_url",
"type",
"briefing_notes",
"headline",
"summary_notes",
"started_at",
"ended_at",
"url",
"duration_minutes",
"actions_created",
"actions_reviewed"
],
"additionalProperties": false
},
"actions": {
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Due. May be unset on a web draft; a set date cannot be cleared."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"sort_order": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Drag order within an action group; not a progress status."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"overdue": {
"type": "boolean"
},
"done_since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"cycle_id",
"objective_id",
"title",
"description",
"due_at",
"status",
"sort_order",
"session_id",
"created_at",
"url",
"overdue",
"done_since_boundary"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"session",
"actions",
"continuations"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"totals": {
"type": "object",
"properties": {
"actions": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"actions"
],
"additionalProperties": false
}
},
"required": [
"as_of",
"data",
"totals"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"as_of": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
"description": "Server snapshot time for the stale-snapshot footer."
},
"data": {
"anyOf": [
{
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"vendor": {
"type": "string",
"enum": [
"claude",
"openai"
],
"description": "Conversation host: claude is shown as Claude; openai is shown as ChatGPT."
},
"source_url": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "External conversation link used by Open the conversation. Not the app detail URL."
},
"type": {
"anyOf": [
{
"type": "string",
"enum": [
"goal_setup",
"check_in",
"review",
"open_coaching"
],
"description": "Coaching session type: Goal setup, Check-in, Review or Open coaching. Separate from whether the session is still open."
},
{
"type": "null"
}
]
},
"briefing_notes": {
"type": "string",
"description": "UI document: Briefing. Server-prepared coaching context."
},
"headline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "One-line coaching-session summary used in session lists."
},
"summary_notes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI document: Summary. Saved when the coaching session closes."
},
"started_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"ended_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
],
"description": "Closed when set; In progress when null. This is derived session state, not a stored status enum."
},
"url": {
"type": "string",
"format": "uri",
"description": "Internal app link to coaching session details; distinct from source_url."
},
"duration_minutes": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"actions_created": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"actions_reviewed": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"id",
"vendor",
"source_url",
"type",
"briefing_notes",
"headline",
"summary_notes",
"started_at",
"ended_at",
"url",
"duration_minutes",
"actions_created",
"actions_reviewed"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"totals": {
"type": "object",
"properties": {
"sessions": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"sessions"
],
"additionalProperties": false
}
},
"required": [
"as_of",
"data",
"totals"
],
"additionalProperties": false
}
]
},
"readiness": "contract-only",
"binding": "planned",
"gap": "Supply the detail/list variant and bounded session actions; compact session results do not satisfy detail payloads.",
"sources": [
{
"tool": "session_read",
"operations": [
"list",
"get"
],
"when": "list or get for a stored session; skip missing-session results.",
"services": [
"sessions.list",
"sessions.get_stored"
]
},
{
"tool": "session_close",
"operations": [
"call"
],
"when": "Successful explicit closure; show the saved summary and session actions.",
"services": [
"sessions.close"
]
}
]
},
{
"id": "session_document",
"title": "Session document",
"owner": "F7 Sessions",
"kind": "product",
"pages": [
"/sessions/:id/briefing",
"/sessions/:id/summary"
],
"resource_uri": "ui://widget/session-doc.v1.html",
"payload": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"as_of": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
"description": "Server snapshot time for the stale-snapshot footer."
},
"data": {
"anyOf": [
{
"type": "object",
"properties": {
"session": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"vendor": {
"type": "string",
"enum": [
"claude",
"openai"
],
"description": "Conversation host: claude is shown as Claude; openai is shown as ChatGPT."
},
"source_url": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "External conversation link used by Open the conversation. Not the app detail URL."
},
"type": {
"anyOf": [
{
"type": "string",
"enum": [
"goal_setup",
"check_in",
"review",
"open_coaching"
],
"description": "Coaching session type: Goal setup, Check-in, Review or Open coaching. Separate from whether the session is still open."
},
{
"type": "null"
}
]
},
"briefing_notes": {
"type": "string",
"description": "UI document: Briefing. Server-prepared coaching context."
},
"headline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "One-line coaching-session summary used in session lists."
},
"summary_notes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI document: Summary. Saved when the coaching session closes."
},
"started_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"ended_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
],
"description": "Closed when set; In progress when null. This is derived session state, not a stored status enum."
},
"url": {
"type": "string",
"format": "uri",
"description": "Internal app link to coaching session details; distinct from source_url."
},
"duration_minutes": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"actions_created": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"actions_reviewed": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"id",
"vendor",
"source_url",
"type",
"briefing_notes",
"headline",
"summary_notes",
"started_at",
"ended_at",
"url",
"duration_minutes",
"actions_created",
"actions_reviewed"
],
"additionalProperties": false
},
"document": {
"type": "string",
"enum": [
"briefing",
"summary"
]
},
"text": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"session",
"document",
"text"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"totals": {
"type": "object",
"properties": {},
"additionalProperties": false
}
},
"required": [
"as_of",
"data",
"totals"
],
"additionalProperties": false
},
"readiness": "contract-only",
"binding": "planned",
"gap": "Provide the complete session record and selected canonical document text; render stored text as data, never instructions.",
"sources": [
{
"tool": "session_start",
"operations": [
"call"
],
"when": "Active access only; saved briefing document.",
"services": [
"sessions.start"
]
},
{
"tool": "session_read",
"operations": [
"get"
],
"when": "get with a selected stored briefing or summary document.",
"services": [
"sessions.get_stored"
]
}
]
},
{
"id": "cycle",
"title": "Cycle",
"owner": "F2 Cycles",
"kind": "product",
"pages": [
"/cycles",
"/cycles/:id"
],
"resource_uri": "ui://widget/cycle.v1.html",
"payload": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"anyOf": [
{
"type": "object",
"properties": {
"as_of": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
"description": "Server snapshot time for the stale-snapshot footer."
},
"data": {
"anyOf": [
{
"type": "object",
"properties": {
"cycle": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
},
"objectives": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Deadline; null when no deadline has been set."
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Progress. Derived from measurable results, independently of Status."
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Historical progress at the resolved last-session boundary; not current Progress."
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"cycle_id",
"title",
"description",
"deadline_at",
"status",
"created_at",
"short_code",
"url",
"progress_pct",
"boundary_progress_pct",
"movement_pp"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"cycle",
"objectives",
"continuations"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"totals": {
"type": "object",
"properties": {
"objectives": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"objectives"
],
"additionalProperties": false
}
},
"required": [
"as_of",
"data",
"totals"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"as_of": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
"description": "Server snapshot time for the stale-snapshot footer."
},
"data": {
"anyOf": [
{
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"totals": {
"type": "object",
"properties": {
"cycles": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"cycles"
],
"additionalProperties": false
}
},
"required": [
"as_of",
"data",
"totals"
],
"additionalProperties": false
}
]
},
"readiness": "contract-only",
"binding": "planned",
"gap": "Bind list/detail variants and include bounded objectives for a cycle detail; never render a deleted cycle.",
"sources": [
{
"tool": "cycle_read",
"operations": [
"list",
"get"
],
"when": "list or get; skip a missing active cycle.",
"services": [
"cycles.list",
"cycles.get",
"cycles.get_stored_active"
]
},
{
"tool": "cycle_update",
"operations": [
"call"
],
"when": "Successful date/intention update.",
"services": [
"cycles.update"
]
},
{
"tool": "cycle_lifecycle",
"operations": [
"create",
"archive",
"activate"
],
"when": "Successful create/archive/activate.",
"services": [
"cycles.create",
"cycles.update"
]
}
]
},
{
"id": "example",
"title": "Example",
"owner": "Temporary scaffold reference",
"kind": "scaffold",
"pages": [
"/example"
],
"resource_uri": "ui://widget/example-card.v0.html",
"payload": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"examples": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"name": {
"type": "string"
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
},
"stale": {
"type": "boolean"
}
},
"required": [
"id",
"name",
"created_at",
"stale"
],
"additionalProperties": false
}
}
},
"required": [
"examples"
],
"additionalProperties": false
},
"readiness": "implemented",
"binding": "bound",
"gap": null,
"sources": [
{
"tool": "example_list",
"operations": [
"call"
],
"when": "Successful list.",
"services": []
}
]
}
][
{
"group": "cycles",
"name": "cycle_created",
"payload": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"surface": {
"type": "string",
"enum": [
"web",
"chat"
]
}
},
"required": [
"cycle_id",
"surface"
],
"additionalProperties": false
},
"description": "Durable cycle creation.",
"requirement": "docs/feature-specs/F2-cycles.md",
"producers": [
{
"service": "cycles.create",
"when": "After durable creation; no replay duplicate."
}
],
"external_producers": [],
"gaps": []
},
{
"group": "cycles",
"name": "cycle_archived",
"payload": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"reason": {
"type": "string",
"enum": [
"expired",
"manual",
"replaced"
]
}
},
"required": [
"cycle_id",
"reason"
],
"additionalProperties": false
},
"description": "Actual transition to archived; never for a no-op.",
"requirement": "docs/feature-specs/F2-cycles.md",
"producers": [
{
"service": "cycles.create",
"when": "When creation replaces an incumbent active cycle; reason replaced."
},
{
"service": "cycles.resolve_active",
"when": "When lazy expiry actually archives the active cycle; reason expired."
},
{
"service": "cycles.update",
"when": "When status changes to archived (manual), or activation replaces the incumbent (replaced); never for date/field edits or no-op status."
}
],
"external_producers": [],
"gaps": []
},
{
"group": "objectives",
"name": "objective_created",
"payload": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"surface": {
"type": "string",
"enum": [
"web",
"chat"
]
}
},
"required": [
"objective_id",
"cycle_id",
"surface"
],
"additionalProperties": false
},
"description": "Durable objective creation; no duplicate on original-outcome replay.",
"requirement": "docs/feature-specs/F3-objectives.md",
"producers": [
{
"service": "objectives.create",
"when": "After durable creation; no replay duplicate."
}
],
"external_producers": [],
"gaps": []
},
{
"group": "results",
"name": "result_update_recorded",
"payload": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"metric_type": {
"type": "string",
"enum": [
"number",
"percentage",
"milestone",
"habit",
"performance"
],
"description": "UI label: Type. Number, Percentage, Milestone, Habit or Performance."
},
"surface": {
"type": "string",
"enum": [
"web",
"chat"
]
}
},
"required": [
"result_id",
"metric_type",
"surface"
],
"additionalProperties": false
},
"description": "Saved value, reading, milestone flip, habit mark or unmark; not a comment-only update.",
"requirement": "docs/feature-specs/F4-results.md",
"producers": [
{
"service": "result_logs.create",
"when": "When numeric/performance evidence or a milestone flip is saved; not comment-only rows."
},
{
"service": "habit_logs.set",
"when": "When a habit mark/unmark changes recorded progress; not comment-only changes or replay."
}
],
"external_producers": [],
"gaps": []
},
{
"group": "actions",
"name": "action_created",
"payload": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"action_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"due_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
]
},
"surface": {
"type": "string",
"enum": [
"web",
"chat"
]
}
},
"required": [
"action_id",
"cycle_id",
"due_at",
"surface"
],
"additionalProperties": false
},
"description": "Durable action creation; due_at is null for an unset web draft.",
"requirement": "docs/feature-specs/F5-actions.md",
"producers": [
{
"service": "actions.create",
"when": "After durable creation; no replay duplicate."
}
],
"external_producers": [],
"gaps": []
},
{
"group": "actions",
"name": "action_status_changed",
"payload": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"action_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"surface": {
"type": "string",
"enum": [
"web",
"chat"
]
}
},
"required": [
"action_id",
"status",
"surface"
],
"additionalProperties": false
},
"description": "Each persisted action log, including a repeated status with a comment.",
"requirement": "docs/feature-specs/F5-actions.md",
"producers": [
{
"service": "action_logs.create",
"when": "For each persisted log, including repeat status with comment; not receipt replay."
}
],
"external_producers": [],
"gaps": []
},
{
"group": "notes",
"name": "note_created",
"payload": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"note_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"surface": {
"type": "string",
"enum": [
"web",
"chat"
]
}
},
"required": [
"note_id",
"surface"
],
"additionalProperties": false
},
"description": "Durable note creation; no duplicate on original-outcome replay.",
"requirement": "docs/feature-specs/F6-notes.md",
"producers": [
{
"service": "notes.create",
"when": "After durable creation; not autosave updates or receipt replay."
}
],
"external_producers": [],
"gaps": []
},
{
"group": "sessions",
"name": "session_started",
"payload": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"session_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"vendor": {
"type": "string",
"enum": [
"claude",
"openai"
],
"description": "Conversation host: claude is shown as Claude; openai is shown as ChatGPT."
},
"surface": {
"type": "string",
"enum": [
"web",
"chat"
]
}
},
"required": [
"session_id",
"vendor",
"surface"
],
"additionalProperties": false
},
"description": "New persisted session, not reuse of an existing open session.",
"requirement": "docs/feature-specs/F7-sessions.md",
"producers": [
{
"service": "sessions.start",
"when": "Only when a new session is persisted; not existing-session reuse."
}
],
"external_producers": [],
"gaps": []
},
{
"group": "sessions",
"name": "session_summary_written",
"payload": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"session_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"type": {
"type": "string",
"enum": [
"goal_setup",
"check_in",
"review",
"open_coaching"
],
"description": "Coaching session type: Goal setup, Check-in, Review or Open coaching. Separate from whether the session is still open."
}
},
"required": [
"session_id",
"type"
],
"additionalProperties": false
},
"description": "First successful close with a summary, not replay or forced stale-session close.",
"requirement": "docs/feature-specs/F7-sessions.md",
"producers": [
{
"service": "sessions.close",
"when": "On the first successful close with summary; not replay or forced stale close."
}
],
"external_producers": [],
"gaps": []
},
{
"group": "sessions",
"name": "chat_tool_used",
"payload": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"tool_name": {
"type": "string",
"minLength": 1
},
"success": {
"type": "boolean"
}
},
"required": [
"tool_name",
"success"
],
"additionalProperties": false
},
"description": "MCP tool call outcome; no stored coaching content.",
"requirement": "docs/feature-specs/F7-sessions.md",
"producers": [],
"external_producers": [
{
"kind": "mcp-boundary",
"source": "packages/core/src/shared/mcp/index.ts",
"when": "For a tool call with an authenticated actor; both success and failure outcomes."
}
],
"gaps": [
"Specify treatment of calls without authenticated identity; tenant event storage requires an actor."
]
},
{
"group": "identity_billing",
"name": "account_created",
"payload": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"user_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"user_id"
],
"additionalProperties": false
},
"description": "Durable account creation; user_id matches the canonical user UUID.",
"requirement": "docs/feature-specs/F1-identity.md",
"producers": [],
"external_producers": [
{
"kind": "auth-hook",
"source": "packages/core/src/shared/auth/server.ts",
"when": "After a newly persisted account."
}
],
"gaps": []
},
{
"group": "identity_billing",
"name": "subscription_started",
"payload": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"plan": {
"type": "string",
"minLength": 1,
"description": "UI label: Plan. Provider-backed name of the selected plan."
},
"price": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991,
"description": "Configured POC monthly price in GBP minor units; 500 means £5."
}
},
"required": [
"plan",
"price"
],
"additionalProperties": false
},
"description": "First transition to active paid access.",
"requirement": "docs/feature-specs/F1-identity.md",
"producers": [],
"external_producers": [
{
"kind": "billing-webhook",
"source": "packages/core/src/features/identity-billing/handler.ts",
"when": "On the first verified transition to active; not checkout URL creation."
}
],
"gaps": []
},
{
"group": "identity_billing",
"name": "subscription_cancelled",
"payload": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"tenure_days": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"reason_code": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"reason_text": {
"type": "string"
}
},
"required": [
"tenure_days",
"reason_code"
],
"additionalProperties": false
},
"description": "Once per scheduled or immediate cancellation; no duplicate webhook delivery.",
"requirement": "docs/feature-specs/F1-identity.md",
"producers": [],
"external_producers": [
{
"kind": "billing-webhook",
"source": "packages/core/src/features/identity-billing/handler.ts",
"when": "On a newly applied scheduled or immediate cancellation, not a duplicate delivery."
}
],
"gaps": []
},
{
"group": "identity_billing",
"name": "connector_authorised",
"payload": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {},
"additionalProperties": false
},
"description": "New durable connector consent; not a replay.",
"requirement": "docs/feature-specs/F1-identity.md",
"producers": [],
"external_producers": [
{
"kind": "auth-hook",
"source": "packages/core/src/shared/auth/server.ts",
"when": "After new connector consent is persisted."
}
],
"gaps": []
},
{
"group": "identity_billing",
"name": "onboarding_step_completed",
"payload": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"step": {
"anyOf": [
{
"type": "number",
"const": 1
},
{
"type": "number",
"const": 2
},
{
"type": "number",
"const": 3
}
]
}
},
"required": [
"step"
],
"additionalProperties": false
},
"description": "Verified onboarding step completion; never inferred from a redirect alone.",
"requirement": "docs/feature-specs/F1-identity.md",
"producers": [],
"external_producers": [
{
"kind": "page",
"source": "packages/core/src/features/identity-billing/onboarding.page.tsx",
"when": "After verified step completion; no new public event API is authorized."
}
],
"gaps": [
"Specify trusted server recording and repeat-visit deduplication; the page alone is not an authorized event writer."
]
},
{
"group": "identity_billing",
"name": "profile_updated",
"payload": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"fields": {
"minItems": 1,
"type": "array",
"items": {
"type": "string",
"enum": [
"name",
"about_me",
"timezone"
]
}
}
},
"required": [
"fields"
],
"additionalProperties": false
},
"description": "Changed profile field names only; never profile content.",
"requirement": "docs/feature-specs/F1-identity.md",
"producers": [
{
"service": "user.update",
"when": "When at least one editable profile field changes; payload lists changed names only."
}
],
"external_producers": [],
"gaps": []
},
{
"group": "identity_billing",
"name": "account_deleted",
"payload": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {},
"additionalProperties": false
},
"description": "Successful account deletion; record in the deletion transaction before removing the user so the existing ON DELETE SET NULL preserves the event.",
"requirement": "docs/feature-specs/F1-identity.md",
"producers": [
{
"service": "user.delete",
"when": "In the successful deletion transaction, before user removal; ON DELETE SET NULL retains the event. Never on failed provider cancellation or replay."
}
],
"external_producers": [],
"gaps": []
},
{
"group": "example",
"name": "example_created",
"payload": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"exampleId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"required": [
"exampleId"
],
"additionalProperties": false
},
"description": "Retained scaffold: one event per fresh example write in the same transaction.",
"requirement": "packages/core/src/features/example/docs.md",
"producers": [],
"external_producers": [],
"gaps": []
}
]Feature declaration: createCycle
Requirement: docs/feature-specs/F2-cycles.md · Access: entitled-write
Tables: cycles (write), objectives (read), idempotency_keys (write)
Trusted context: authenticated actor
Retry: Actor/operation/key-scoped original-outcome replay, including post-commit response failures.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "cycles.create",
"service": "cycles.create",
"binding": "bound"
}
][
{
"tool": "cycle_lifecycle",
"collection": "cycles",
"specification": "docs/feature-specs/F2-cycles.md#mcp-contract",
"operation": "create",
"binding": "bound",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"cycles.create"
],
"gap": null,
"projection": "Dispatch lifecycle operations explicitly; read returns the cycle only; writes project record.cycle and changed; readers preserve continuations."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts. Calendar date, YYYY-MM-DD. Required on create; omit on update to preserve."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends. Calendar date, YYYY-MM-DD; must be after the resulting start date."
},
"intention": {
"description": "Personal focus. Omit to preserve on update; null clears it.",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"idempotency_key": {
"type": "string",
"minLength": 1,
"maxLength": 255,
"description": "Unique key per logical create. Reuse the same key AND fields on every retry, including uncertain outcomes. A new create needs a new key."
}
},
"required": [
"start_at",
"end_at",
"idempotency_key"
],
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"record": {
"type": "object",
"properties": {
"cycle": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
},
"objectives": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Deadline; null when no deadline has been set."
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Progress. Derived from measurable results, independently of Status."
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Historical progress at the resolved last-session boundary; not current Progress."
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"cycle_id",
"title",
"description",
"deadline_at",
"status",
"created_at",
"short_code",
"url",
"progress_pct",
"boundary_progress_pct",
"movement_pp"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"cycle",
"objectives",
"continuations"
],
"additionalProperties": false
},
"changed": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"entity": {
"type": "string",
"enum": [
"user",
"cycle",
"objective",
"result",
"result_log",
"action",
"action_log",
"session",
"note",
"habit_log"
]
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"entity",
"id"
],
"additionalProperties": false
}
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"record",
"changed",
"continuations"
],
"additionalProperties": false
}[
{
"tool": "cycle_lifecycle",
"collection": "cycles",
"specification": "docs/feature-specs/F2-cycles.md#mcp-contract",
"operation": "create",
"binding": "bound",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"cycles.create"
],
"gap": null,
"projection": "Dispatch lifecycle operations explicitly; read returns the cycle only; writes project record.cycle and changed; readers preserve continuations.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts. Calendar date, YYYY-MM-DD. Required on create; omit on update to preserve."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends. Calendar date, YYYY-MM-DD; must be after the resulting start date."
},
"intention": {
"description": "Personal focus. Omit to preserve on update; null clears it.",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"idempotency_key": {
"type": "string",
"minLength": 1,
"maxLength": 255,
"description": "Unique key per logical create. Reuse the same key AND fields on every retry, including uncertain outcomes. A new create needs a new key."
},
"operation": {
"type": "string",
"const": "create"
}
},
"required": [
"start_at",
"end_at",
"idempotency_key",
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "archive"
}
},
"required": [
"id",
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "activate"
}
},
"required": [
"id",
"operation"
],
"additionalProperties": false
}
]
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"cycle": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
},
"changed": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"entity": {
"type": "string",
"enum": [
"user",
"cycle",
"objective",
"result",
"result_log",
"action",
"action_log",
"session",
"note",
"habit_log"
]
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"entity",
"id"
],
"additionalProperties": false
}
}
},
"required": [
"cycle",
"changed"
],
"additionalProperties": false
}
}
]Feature declaration: getActiveCycle
Requirement: docs/feature-specs/F2-cycles.md · Access: retained-read
Tables: cycles (write)
Trusted context: authenticated actor
Retry: Inspect state after uncertain outcomes; never infer rollback from a response failure.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "cycles.resolve_active",
"service": "cycles.resolve_active",
"binding": "bound"
}
][]
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {},
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}[]
Feature declaration: getStoredActiveCycle
Requirement: docs/feature-specs/F2-cycles.md · Access: retained-read
Tables: cycles (read)
Trusted context: authenticated actor
Retry: Safe to retry with the same resolved filters and cursor.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[]
[
{
"tool": "cycle_read",
"collection": "cycles",
"specification": "docs/feature-specs/F2-cycles.md#entity-specific-cycle-query",
"operation": "get",
"binding": "bound",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"cycles.get",
"cycles.get_stored_active"
],
"gap": null,
"projection": "Dispatch lifecycle operations explicitly; read returns the cycle only; writes project record.cycle and changed; readers preserve continuations."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {},
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}[
{
"tool": "cycle_read",
"collection": "cycles",
"specification": "docs/feature-specs/F2-cycles.md#entity-specific-cycle-query",
"operation": "get",
"binding": "bound",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"cycles.get",
"cycles.get_stored_active"
],
"gap": null,
"projection": "Dispatch lifecycle operations explicitly; read returns the cycle only; writes project record.cycle and changed; readers preserve continuations.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 100
},
"operation": {
"type": "string",
"const": "list",
"description": "Find cycles; reuse fresh results directly for updates."
}
},
"required": [
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "get"
},
"id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "string",
"const": "active"
}
],
"description": "Owned cycle UUID from fresh context, or active for the stored active cycle at execution. No date-based expiry or fallback. Use the UUID for a specifically selected cycle."
}
},
"required": [
"operation",
"id"
],
"additionalProperties": false
}
]
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"anyOf": [
{
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"continuation": {
"anyOf": [
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"const": "cycle_read"
},
"arguments": {
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "list"
},
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"required": [
"operation",
"cursor",
"limit"
],
"additionalProperties": false
}
},
"required": [
"tool",
"arguments"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor",
"continuation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"cycle": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}
},
"required": [
"cycle"
],
"additionalProperties": false
}
]
}
}
]Feature declaration: previewCycleDeletion
Requirement: docs/feature-specs/F2-cycles.md · Access: entitled-write
Tables: cycles (read), objectives (read), results (read), result_logs (read), habit_logs (read), actions (read), action_logs (read)
Trusted context: authenticated actor
Retry: Inspect state after uncertain outcomes; never infer rollback from a response failure.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "cycles.preview_deletion",
"service": "cycles.preview_deletion",
"binding": "bound"
}
][
{
"tool": "cycle_delete",
"collection": "cycles",
"specification": "docs/feature-specs/F2-cycles.md#mcp-contract",
"operation": "preview",
"binding": "bound",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"cycles.preview_deletion"
],
"gap": null,
"projection": "Dispatch lifecycle operations explicitly; read returns the cycle only; writes project record.cycle and changed; readers preserve continuations."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"id"
],
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "preview"
},
"preview_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"expires_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"cycle": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
}
},
"required": [
"id",
"start_at",
"end_at",
"status"
],
"additionalProperties": false
},
"deleted": {
"type": "object",
"properties": {
"cycles": {
"type": "number",
"const": 1
},
"objectives": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"results": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"result_logs": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"habit_logs": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"actions": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"action_logs": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"cycles",
"objectives",
"results",
"result_logs",
"habit_logs",
"actions",
"action_logs"
],
"additionalProperties": false
},
"retained": {
"type": "array",
"prefixItems": [
{
"type": "string",
"const": "notes"
},
{
"type": "string",
"const": "sessions"
}
]
},
"active_remaining": {
"type": "boolean"
},
"approval": {
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "required"
},
"url": {
"type": "string",
"format": "uri"
}
},
"required": [
"status",
"url"
],
"additionalProperties": false
}
},
"required": [
"operation",
"preview_id",
"expires_at",
"cycle",
"deleted",
"retained",
"active_remaining",
"approval"
],
"additionalProperties": false
}[
{
"tool": "cycle_delete",
"collection": "cycles",
"specification": "docs/feature-specs/F2-cycles.md#mcp-contract",
"operation": "preview",
"binding": "bound",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"cycles.preview_deletion"
],
"gap": null,
"projection": "Dispatch lifecycle operations explicitly; read returns the cycle only; writes project record.cycle and changed; readers preserve continuations.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "preview"
}
},
"required": [
"id",
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"preview_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Server-issued impact preview ID. This is not approval: the service checks genuine user approval recorded by the trusted host/application."
},
"operation": {
"type": "string",
"const": "commit"
}
},
"required": [
"id",
"preview_id",
"operation"
],
"additionalProperties": false
}
]
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"anyOf": [
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "preview"
},
"preview_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"expires_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"cycle": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
}
},
"required": [
"id",
"start_at",
"end_at",
"status"
],
"additionalProperties": false
},
"deleted": {
"type": "object",
"properties": {
"cycles": {
"type": "number",
"const": 1
},
"objectives": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"results": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"result_logs": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"habit_logs": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"actions": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"action_logs": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"cycles",
"objectives",
"results",
"result_logs",
"habit_logs",
"actions",
"action_logs"
],
"additionalProperties": false
},
"retained": {
"type": "array",
"prefixItems": [
{
"type": "string",
"const": "notes"
},
{
"type": "string",
"const": "sessions"
}
]
},
"active_remaining": {
"type": "boolean"
},
"approval": {
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "required"
},
"url": {
"type": "string",
"format": "uri"
}
},
"required": [
"status",
"url"
],
"additionalProperties": false
}
},
"required": [
"operation",
"preview_id",
"expires_at",
"cycle",
"deleted",
"retained",
"active_remaining",
"approval"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"active_remaining": {
"type": "boolean"
},
"operation": {
"type": "string",
"const": "commit"
}
},
"required": [
"id",
"active_remaining",
"operation"
],
"additionalProperties": false
}
]
}
}
]Requirement: docs/feature-specs/F2-cycles.md · Access: retained-read
Tables: cycles (read), objectives (read)
Trusted context: authenticated actor
Retry: Safe to retry with the same resolved filters and cursor.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "cycles.get",
"service": "cycles.get",
"binding": "bound"
}
][
{
"tool": "cycle_read",
"collection": "cycles",
"specification": "docs/feature-specs/F2-cycles.md#entity-specific-cycle-query",
"operation": "get",
"binding": "bound",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"cycles.get",
"cycles.get_stored_active"
],
"gap": null,
"projection": "Dispatch lifecycle operations explicitly; read returns the cycle only; writes project record.cycle and changed; readers preserve continuations."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"id"
],
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"cycle": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
},
"objectives": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Deadline; null when no deadline has been set."
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Progress. Derived from measurable results, independently of Status."
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Historical progress at the resolved last-session boundary; not current Progress."
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"cycle_id",
"title",
"description",
"deadline_at",
"status",
"created_at",
"short_code",
"url",
"progress_pct",
"boundary_progress_pct",
"movement_pp"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"cycle",
"objectives",
"continuations"
],
"additionalProperties": false
}[
{
"tool": "cycle_read",
"collection": "cycles",
"specification": "docs/feature-specs/F2-cycles.md#entity-specific-cycle-query",
"operation": "get",
"binding": "bound",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"cycles.get",
"cycles.get_stored_active"
],
"gap": null,
"projection": "Dispatch lifecycle operations explicitly; read returns the cycle only; writes project record.cycle and changed; readers preserve continuations.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 100
},
"operation": {
"type": "string",
"const": "list",
"description": "Find cycles; reuse fresh results directly for updates."
}
},
"required": [
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "get"
},
"id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "string",
"const": "active"
}
],
"description": "Owned cycle UUID from fresh context, or active for the stored active cycle at execution. No date-based expiry or fallback. Use the UUID for a specifically selected cycle."
}
},
"required": [
"operation",
"id"
],
"additionalProperties": false
}
]
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"anyOf": [
{
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"continuation": {
"anyOf": [
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"const": "cycle_read"
},
"arguments": {
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "list"
},
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"required": [
"operation",
"cursor",
"limit"
],
"additionalProperties": false
}
},
"required": [
"tool",
"arguments"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor",
"continuation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"cycle": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}
},
"required": [
"cycle"
],
"additionalProperties": false
}
]
}
}
]Feature declaration: listCycles
Requirement: docs/feature-specs/F2-cycles.md · Access: retained-read
Tables: cycles (read)
Trusted context: authenticated actor
Retry: Safe to retry with the same resolved filters and cursor.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "cycles.list",
"service": "cycles.list",
"binding": "bound"
}
][
{
"tool": "cycle_read",
"collection": "cycles",
"specification": "docs/feature-specs/F2-cycles.md#entity-specific-cycle-query",
"operation": "list",
"binding": "bound",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"cycles.list"
],
"gap": null,
"projection": "Dispatch lifecycle operations explicitly; read returns the cycle only; writes project record.cycle and changed; readers preserve continuations."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
}[
{
"tool": "cycle_read",
"collection": "cycles",
"specification": "docs/feature-specs/F2-cycles.md#entity-specific-cycle-query",
"operation": "list",
"binding": "bound",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"cycles.list"
],
"gap": null,
"projection": "Dispatch lifecycle operations explicitly; read returns the cycle only; writes project record.cycle and changed; readers preserve continuations.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 100
},
"operation": {
"type": "string",
"const": "list",
"description": "Find cycles; reuse fresh results directly for updates."
}
},
"required": [
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "get"
},
"id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "string",
"const": "active"
}
],
"description": "Owned cycle UUID from fresh context, or active for the stored active cycle at execution. No date-based expiry or fallback. Use the UUID for a specifically selected cycle."
}
},
"required": [
"operation",
"id"
],
"additionalProperties": false
}
]
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"anyOf": [
{
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"continuation": {
"anyOf": [
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"const": "cycle_read"
},
"arguments": {
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "list"
},
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"required": [
"operation",
"cursor",
"limit"
],
"additionalProperties": false
}
},
"required": [
"tool",
"arguments"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor",
"continuation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"cycle": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}
},
"required": [
"cycle"
],
"additionalProperties": false
}
]
}
}
]Feature declaration: updateCycle
Requirement: docs/feature-specs/F2-cycles.md · Access: entitled-write
Tables: cycles (write), objectives (read)
Trusted context: authenticated actor
Retry: Inspect state after uncertain outcomes; never infer rollback from a response failure.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "cycles.update",
"service": "cycles.update",
"binding": "bound"
}
][
{
"tool": "cycle_update",
"collection": "cycles",
"specification": "docs/feature-specs/F2-cycles.md#mcp-contract",
"operation": "call",
"binding": "bound",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"cycles.update"
],
"gap": null,
"projection": "Dispatch lifecycle operations explicitly; read returns the cycle only; writes project record.cycle and changed; readers preserve continuations."
},
{
"tool": "cycle_lifecycle",
"collection": "cycles",
"specification": "docs/feature-specs/F2-cycles.md#mcp-contract",
"operation": "archive",
"binding": "bound",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"cycles.update"
],
"gap": null,
"projection": "Dispatch lifecycle operations explicitly; read returns the cycle only; writes project record.cycle and changed; readers preserve continuations."
},
{
"tool": "cycle_lifecycle",
"collection": "cycles",
"specification": "docs/feature-specs/F2-cycles.md#mcp-contract",
"operation": "activate",
"binding": "bound",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"cycles.update"
],
"gap": null,
"projection": "Dispatch lifecycle operations explicitly; read returns the cycle only; writes project record.cycle and changed; readers preserve continuations."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "string",
"const": "active"
}
],
"description": "Owned cycle UUID from fresh context, or active for the stored active cycle at execution. No date-based expiry or fallback. Use the UUID for a specifically selected cycle."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts. Calendar date, YYYY-MM-DD. Required on create; omit on update to preserve."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends. Calendar date, YYYY-MM-DD; must be after the resulting start date."
},
"intention": {
"description": "Personal focus. Omit to preserve on update; null clears it.",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
}
},
"required": [
"id"
],
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"record": {
"type": "object",
"properties": {
"cycle": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
},
"objectives": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Deadline; null when no deadline has been set."
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Progress. Derived from measurable results, independently of Status."
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Historical progress at the resolved last-session boundary; not current Progress."
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"cycle_id",
"title",
"description",
"deadline_at",
"status",
"created_at",
"short_code",
"url",
"progress_pct",
"boundary_progress_pct",
"movement_pp"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"cycle",
"objectives",
"continuations"
],
"additionalProperties": false
},
"changed": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"entity": {
"type": "string",
"enum": [
"user",
"cycle",
"objective",
"result",
"result_log",
"action",
"action_log",
"session",
"note",
"habit_log"
]
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"entity",
"id"
],
"additionalProperties": false
}
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"record",
"changed",
"continuations"
],
"additionalProperties": false
}[
{
"tool": "cycle_update",
"collection": "cycles",
"specification": "docs/feature-specs/F2-cycles.md#mcp-contract",
"operation": "call",
"binding": "bound",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"cycles.update"
],
"gap": null,
"projection": "Dispatch lifecycle operations explicitly; read returns the cycle only; writes project record.cycle and changed; readers preserve continuations.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "string",
"const": "active"
}
],
"description": "Owned cycle UUID from fresh context, or active for the stored active cycle at execution. No date-based expiry or fallback. Use the UUID for a specifically selected cycle."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts. Calendar date, YYYY-MM-DD. Required on create; omit on update to preserve."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends. Calendar date, YYYY-MM-DD; must be after the resulting start date."
},
"intention": {
"description": "Personal focus. Omit to preserve on update; null clears it.",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"id"
],
"additionalProperties": false
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"cycle": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
},
"changed": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"entity": {
"type": "string",
"enum": [
"user",
"cycle",
"objective",
"result",
"result_log",
"action",
"action_log",
"session",
"note",
"habit_log"
]
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"entity",
"id"
],
"additionalProperties": false
}
}
},
"required": [
"cycle",
"changed"
],
"additionalProperties": false
}
},
{
"tool": "cycle_lifecycle",
"collection": "cycles",
"specification": "docs/feature-specs/F2-cycles.md#mcp-contract",
"operation": "archive",
"binding": "bound",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"cycles.update"
],
"gap": null,
"projection": "Dispatch lifecycle operations explicitly; read returns the cycle only; writes project record.cycle and changed; readers preserve continuations.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts. Calendar date, YYYY-MM-DD. Required on create; omit on update to preserve."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends. Calendar date, YYYY-MM-DD; must be after the resulting start date."
},
"intention": {
"description": "Personal focus. Omit to preserve on update; null clears it.",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"idempotency_key": {
"type": "string",
"minLength": 1,
"maxLength": 255,
"description": "Unique key per logical create. Reuse the same key AND fields on every retry, including uncertain outcomes. A new create needs a new key."
},
"operation": {
"type": "string",
"const": "create"
}
},
"required": [
"start_at",
"end_at",
"idempotency_key",
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "archive"
}
},
"required": [
"id",
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "activate"
}
},
"required": [
"id",
"operation"
],
"additionalProperties": false
}
]
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"cycle": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
},
"changed": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"entity": {
"type": "string",
"enum": [
"user",
"cycle",
"objective",
"result",
"result_log",
"action",
"action_log",
"session",
"note",
"habit_log"
]
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"entity",
"id"
],
"additionalProperties": false
}
}
},
"required": [
"cycle",
"changed"
],
"additionalProperties": false
}
},
{
"tool": "cycle_lifecycle",
"collection": "cycles",
"specification": "docs/feature-specs/F2-cycles.md#mcp-contract",
"operation": "activate",
"binding": "bound",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"cycles.update"
],
"gap": null,
"projection": "Dispatch lifecycle operations explicitly; read returns the cycle only; writes project record.cycle and changed; readers preserve continuations.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts. Calendar date, YYYY-MM-DD. Required on create; omit on update to preserve."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends. Calendar date, YYYY-MM-DD; must be after the resulting start date."
},
"intention": {
"description": "Personal focus. Omit to preserve on update; null clears it.",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"idempotency_key": {
"type": "string",
"minLength": 1,
"maxLength": 255,
"description": "Unique key per logical create. Reuse the same key AND fields on every retry, including uncertain outcomes. A new create needs a new key."
},
"operation": {
"type": "string",
"const": "create"
}
},
"required": [
"start_at",
"end_at",
"idempotency_key",
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "archive"
}
},
"required": [
"id",
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "activate"
}
},
"required": [
"id",
"operation"
],
"additionalProperties": false
}
]
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"cycle": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
},
"changed": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"entity": {
"type": "string",
"enum": [
"user",
"cycle",
"objective",
"result",
"result_log",
"action",
"action_log",
"session",
"note",
"habit_log"
]
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"entity",
"id"
],
"additionalProperties": false
}
}
},
"required": [
"cycle",
"changed"
],
"additionalProperties": false
}
}
]Feature declaration: deleteCycle
Requirement: docs/feature-specs/F2-cycles.md · Access: entitled-write
Tables: cycles (delete)
Trusted context: authenticated actor
Retry: Inspect state after uncertain outcomes; never infer rollback from a response failure.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "cycles.delete",
"service": "cycles.delete",
"binding": "bound"
}
][
{
"tool": "cycle_delete",
"collection": "cycles",
"specification": "docs/feature-specs/F2-cycles.md#mcp-contract",
"operation": "commit",
"binding": "bound",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"cycles.delete"
],
"gap": null,
"projection": "Dispatch lifecycle operations explicitly; read returns the cycle only; writes project record.cycle and changed; readers preserve continuations."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"preview_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Server-issued impact preview ID. This is not approval: the service checks genuine user approval recorded by the trusted host/application."
}
},
"required": [
"id",
"preview_id"
],
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"active_remaining": {
"type": "boolean"
}
},
"required": [
"id",
"active_remaining"
],
"additionalProperties": false
}[
{
"tool": "cycle_delete",
"collection": "cycles",
"specification": "docs/feature-specs/F2-cycles.md#mcp-contract",
"operation": "commit",
"binding": "bound",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"cycles.delete"
],
"gap": null,
"projection": "Dispatch lifecycle operations explicitly; read returns the cycle only; writes project record.cycle and changed; readers preserve continuations.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "preview"
}
},
"required": [
"id",
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"preview_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Server-issued impact preview ID. This is not approval: the service checks genuine user approval recorded by the trusted host/application."
},
"operation": {
"type": "string",
"const": "commit"
}
},
"required": [
"id",
"preview_id",
"operation"
],
"additionalProperties": false
}
]
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"anyOf": [
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "preview"
},
"preview_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"expires_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"cycle": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
}
},
"required": [
"id",
"start_at",
"end_at",
"status"
],
"additionalProperties": false
},
"deleted": {
"type": "object",
"properties": {
"cycles": {
"type": "number",
"const": 1
},
"objectives": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"results": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"result_logs": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"habit_logs": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"actions": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"action_logs": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"cycles",
"objectives",
"results",
"result_logs",
"habit_logs",
"actions",
"action_logs"
],
"additionalProperties": false
},
"retained": {
"type": "array",
"prefixItems": [
{
"type": "string",
"const": "notes"
},
{
"type": "string",
"const": "sessions"
}
]
},
"active_remaining": {
"type": "boolean"
},
"approval": {
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "required"
},
"url": {
"type": "string",
"format": "uri"
}
},
"required": [
"status",
"url"
],
"additionalProperties": false
}
},
"required": [
"operation",
"preview_id",
"expires_at",
"cycle",
"deleted",
"retained",
"active_remaining",
"approval"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"active_remaining": {
"type": "boolean"
},
"operation": {
"type": "string",
"const": "commit"
}
},
"required": [
"id",
"active_remaining",
"operation"
],
"additionalProperties": false
}
]
}
}
]Feature declaration: previewObjectiveDeletion
Requirement: docs/feature-specs/F3-objectives.md · Access: entitled-write
Tables: objectives (read), results (read), result_logs (read), habit_logs (read), actions (read), action_logs (read)
Trusted context: authenticated actor
Retry: Preview does not authorize deletion. Commit rechecks actor, target, impact, expiry and application approval; incomplete impact fails closed.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "objectives.preview_deletion",
"service": "objectives.preview_deletion",
"binding": "bound"
}
][
{
"tool": "objective_delete",
"collection": "objectives",
"specification": "docs/feature-specs/F3-objectives.md#mcp-source-mapping--selected-target",
"operation": "preview",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"objectives.preview_deletion"
],
"gap": null,
"projection": "Project record.objective and changed on writes; list uses resolved cycle_id for continuations; get returns objective only."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"id"
],
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "preview"
},
"preview_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"expires_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"target": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
}
},
"required": [
"id",
"title"
],
"additionalProperties": false
},
"deleted": {
"type": "object",
"properties": {
"objectives": {
"type": "number",
"const": 1
},
"results": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"result_logs": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"habit_logs": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"actions": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"action_logs": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"objectives",
"results",
"result_logs",
"habit_logs",
"actions",
"action_logs"
],
"additionalProperties": false
},
"approval": {
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "required"
},
"url": {
"type": "string",
"format": "uri"
}
},
"required": [
"status",
"url"
],
"additionalProperties": false
}
},
"required": [
"operation",
"preview_id",
"expires_at",
"target",
"deleted",
"approval"
],
"additionalProperties": false
}[
{
"tool": "objective_delete",
"collection": "objectives",
"specification": "docs/feature-specs/F3-objectives.md#mcp-source-mapping--selected-target",
"operation": "preview",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"objectives.preview_deletion"
],
"gap": null,
"projection": "Project record.objective and changed on writes; list uses resolved cycle_id for continuations; get returns objective only.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "preview"
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Exact owned record UUID. Resolve ambiguous targets before requesting impact."
}
},
"required": [
"operation",
"id"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "commit"
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"preview_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Server preview ID for this target. Not consent: genuine approval must already be recorded by the trusted application."
}
},
"required": [
"operation",
"id",
"preview_id"
],
"additionalProperties": false
}
]
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "preview"
},
"preview_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"expires_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"target": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
}
},
"required": [
"id",
"title"
],
"additionalProperties": false
},
"deleted": {
"type": "object",
"properties": {
"objectives": {
"type": "number",
"const": 1
},
"results": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"result_logs": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"habit_logs": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"actions": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"action_logs": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"objectives",
"results",
"result_logs",
"habit_logs",
"actions",
"action_logs"
],
"additionalProperties": false
},
"approval": {
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "required"
},
"url": {
"type": "string",
"format": "uri"
}
},
"required": [
"status",
"url"
],
"additionalProperties": false
}
},
"required": [
"operation",
"preview_id",
"expires_at",
"target",
"deleted",
"approval"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "commit"
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"operation",
"id"
],
"additionalProperties": false
}
]
}
}
]Feature declaration: createObjective
Requirement: docs/feature-specs/F3-objectives.md · Access: entitled-write
Tables: objectives (write), cycles (read), results (read), actions (read), idempotency_keys (write)
Trusted context: authenticated actor
Retry: API requires client-key replay; unkeyed MCP calls must inspect state after an uncertain outcome.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "objectives.create",
"service": "objectives.create",
"binding": "bound"
}
][
{
"tool": "objective_write",
"collection": "objectives",
"specification": "docs/feature-specs/F3-objectives.md#mcp-source-mapping--selected-target",
"operation": "create",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"objectives.create"
],
"gap": null,
"projection": "Project record.objective and changed on writes; list uses resolved cycle_id for continuations; get returns objective only."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"anyOf": [
{
"type": "object",
"properties": {
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"description": "UI label: Deadline. Optional; omitted or null creates the objective with no deadline.",
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
]
},
"idempotency_key": {
"type": "string",
"minLength": 1,
"maxLength": 255
}
},
"required": [
"title",
"idempotency_key"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"description": "UI label: Deadline. Optional; omitted or null creates the objective with no deadline.",
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
]
}
},
"required": [
"title"
],
"additionalProperties": false
}
]
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"record": {
"type": "object",
"properties": {
"objective": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Deadline; null when no deadline has been set."
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Progress. Derived from measurable results, independently of Status."
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Historical progress at the resolved last-session boundary; not current Progress."
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"cycle_id",
"title",
"description",
"deadline_at",
"status",
"created_at",
"short_code",
"url",
"progress_pct",
"boundary_progress_pct",
"movement_pp"
],
"additionalProperties": false
},
"cycle": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
},
"results": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"boundary_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 1
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"boundary_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Start. Metric baseline; habit baselines are derived rather than stored."
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
}
]
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"actions": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Due. May be unset on a web draft; a set date cannot be cleared."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"sort_order": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Drag order within an action group; not a progress status."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"overdue": {
"type": "boolean"
},
"done_since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"cycle_id",
"objective_id",
"title",
"description",
"due_at",
"status",
"sort_order",
"session_id",
"created_at",
"url",
"overdue",
"done_since_boundary"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"objective",
"cycle",
"results",
"actions",
"continuations"
],
"additionalProperties": false
},
"changed": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"entity": {
"type": "string",
"enum": [
"user",
"cycle",
"objective",
"result",
"result_log",
"action",
"action_log",
"session",
"note",
"habit_log"
]
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"entity",
"id"
],
"additionalProperties": false
}
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"record",
"changed",
"continuations"
],
"additionalProperties": false
}[
{
"tool": "objective_write",
"collection": "objectives",
"specification": "docs/feature-specs/F3-objectives.md#mcp-source-mapping--selected-target",
"operation": "create",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"objectives.create"
],
"gap": null,
"projection": "Project record.objective and changed on writes; list uses resolved cycle_id for continuations; get returns objective only.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"description": {
"type": "string"
},
"deadline_at": {
"description": "UI label: Deadline. Optional; omitted or null creates the objective with no deadline.",
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
]
},
"operation": {
"type": "string",
"const": "create"
}
},
"required": [
"title",
"description",
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string",
"minLength": 1
},
"description": {
"type": "string"
},
"deadline_at": {
"description": "UI label: Deadline. Omit to preserve; a date sets or replaces it. A deadline cannot be cleared, so null is rejected.",
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
},
"operation": {
"type": "string",
"const": "update"
}
},
"required": [
"id",
"operation"
],
"additionalProperties": false
}
]
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"objective": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Deadline; null when no deadline has been set."
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Progress. Derived from measurable results, independently of Status."
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Historical progress at the resolved last-session boundary; not current Progress."
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"cycle_id",
"title",
"description",
"deadline_at",
"status",
"created_at",
"short_code",
"url",
"progress_pct",
"boundary_progress_pct",
"movement_pp"
],
"additionalProperties": false
},
"changed": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"entity": {
"type": "string",
"enum": [
"user",
"cycle",
"objective",
"result",
"result_log",
"action",
"action_log",
"session",
"note",
"habit_log"
]
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"entity",
"id"
],
"additionalProperties": false
}
}
},
"required": [
"objective",
"changed"
],
"additionalProperties": false
}
}
]Feature declaration: listObjectives
Requirement: docs/feature-specs/F3-objectives.md · Access: retained-read
Tables: objectives (read)
Trusted context: authenticated actor
Retry: Safe to retry with the same resolved filters and cursor.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "objectives.list",
"service": "objectives.list",
"binding": "bound"
}
][
{
"tool": "objective_read",
"collection": "objectives",
"specification": "docs/feature-specs/F3-objectives.md#mcp-source-mapping--selected-target",
"operation": "list",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"objectives.list"
],
"gap": null,
"projection": "Project record.objective and changed on writes; list uses resolved cycle_id for continuations; get returns objective only."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 100
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Deadline; null when no deadline has been set."
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Progress. Derived from measurable results, independently of Status."
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Historical progress at the resolved last-session boundary; not current Progress."
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"cycle_id",
"title",
"description",
"deadline_at",
"status",
"created_at",
"short_code",
"url",
"progress_pct",
"boundary_progress_pct",
"movement_pp"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"cycle_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor",
"cycle_id"
],
"additionalProperties": false
}[
{
"tool": "objective_read",
"collection": "objectives",
"specification": "docs/feature-specs/F3-objectives.md#mcp-source-mapping--selected-target",
"operation": "list",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"objectives.list"
],
"gap": null,
"projection": "Project record.objective and changed on writes; list uses resolved cycle_id for continuations; get returns objective only.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 100
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "get"
}
},
"required": [
"id",
"operation"
],
"additionalProperties": false
}
]
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"anyOf": [
{
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Deadline; null when no deadline has been set."
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Progress. Derived from measurable results, independently of Status."
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Historical progress at the resolved last-session boundary; not current Progress."
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"cycle_id",
"title",
"description",
"deadline_at",
"status",
"created_at",
"short_code",
"url",
"progress_pct",
"boundary_progress_pct",
"movement_pp"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"continuation": {
"anyOf": [
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"const": "objective_read"
},
"arguments": {
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"cursor",
"limit",
"cycle_id",
"operation"
],
"additionalProperties": false
}
},
"required": [
"tool",
"arguments"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"items",
"next_cursor",
"continuation",
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "get"
},
"objective": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Deadline; null when no deadline has been set."
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Progress. Derived from measurable results, independently of Status."
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Historical progress at the resolved last-session boundary; not current Progress."
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"cycle_id",
"title",
"description",
"deadline_at",
"status",
"created_at",
"short_code",
"url",
"progress_pct",
"boundary_progress_pct",
"movement_pp"
],
"additionalProperties": false
}
},
"required": [
"operation",
"objective"
],
"additionalProperties": false
}
]
}
}
]Feature declaration: getObjective
Requirement: docs/feature-specs/F3-objectives.md · Access: retained-read
Tables: objectives (read), cycles (read), results (read), actions (read)
Trusted context: authenticated actor
Retry: Safe to retry with the same resolved filters and cursor.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "objectives.get",
"service": "objectives.get",
"binding": "bound"
}
][
{
"tool": "objective_read",
"collection": "objectives",
"specification": "docs/feature-specs/F3-objectives.md#mcp-source-mapping--selected-target",
"operation": "get",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"objectives.get"
],
"gap": null,
"projection": "Project record.objective and changed on writes; list uses resolved cycle_id for continuations; get returns objective only."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"id"
],
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"objective": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Deadline; null when no deadline has been set."
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Progress. Derived from measurable results, independently of Status."
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Historical progress at the resolved last-session boundary; not current Progress."
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"cycle_id",
"title",
"description",
"deadline_at",
"status",
"created_at",
"short_code",
"url",
"progress_pct",
"boundary_progress_pct",
"movement_pp"
],
"additionalProperties": false
},
"cycle": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
},
"results": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"boundary_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 1
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"boundary_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Start. Metric baseline; habit baselines are derived rather than stored."
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
}
]
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"actions": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Due. May be unset on a web draft; a set date cannot be cleared."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"sort_order": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Drag order within an action group; not a progress status."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"overdue": {
"type": "boolean"
},
"done_since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"cycle_id",
"objective_id",
"title",
"description",
"due_at",
"status",
"sort_order",
"session_id",
"created_at",
"url",
"overdue",
"done_since_boundary"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"objective",
"cycle",
"results",
"actions",
"continuations"
],
"additionalProperties": false
}[
{
"tool": "objective_read",
"collection": "objectives",
"specification": "docs/feature-specs/F3-objectives.md#mcp-source-mapping--selected-target",
"operation": "get",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"objectives.get"
],
"gap": null,
"projection": "Project record.objective and changed on writes; list uses resolved cycle_id for continuations; get returns objective only.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 100
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "get"
}
},
"required": [
"id",
"operation"
],
"additionalProperties": false
}
]
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"anyOf": [
{
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Deadline; null when no deadline has been set."
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Progress. Derived from measurable results, independently of Status."
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Historical progress at the resolved last-session boundary; not current Progress."
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"cycle_id",
"title",
"description",
"deadline_at",
"status",
"created_at",
"short_code",
"url",
"progress_pct",
"boundary_progress_pct",
"movement_pp"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"continuation": {
"anyOf": [
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"const": "objective_read"
},
"arguments": {
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"cursor",
"limit",
"cycle_id",
"operation"
],
"additionalProperties": false
}
},
"required": [
"tool",
"arguments"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"items",
"next_cursor",
"continuation",
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "get"
},
"objective": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Deadline; null when no deadline has been set."
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Progress. Derived from measurable results, independently of Status."
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Historical progress at the resolved last-session boundary; not current Progress."
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"cycle_id",
"title",
"description",
"deadline_at",
"status",
"created_at",
"short_code",
"url",
"progress_pct",
"boundary_progress_pct",
"movement_pp"
],
"additionalProperties": false
}
},
"required": [
"operation",
"objective"
],
"additionalProperties": false
}
]
}
}
]Feature declaration: updateObjective
Requirement: docs/feature-specs/F3-objectives.md · Access: entitled-write
Tables: objectives (write), cycles (read), results (read), actions (read)
Trusted context: authenticated actor
Retry: Inspect state after uncertain outcomes; never infer rollback from a response failure.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "objectives.update",
"service": "objectives.update",
"binding": "bound"
}
][
{
"tool": "objective_write",
"collection": "objectives",
"specification": "docs/feature-specs/F3-objectives.md#mcp-source-mapping--selected-target",
"operation": "update",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"objectives.update"
],
"gap": null,
"projection": "Project record.objective and changed on writes; list uses resolved cycle_id for continuations; get returns objective only."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"description": "UI label: Deadline. Omit to preserve; a date sets or replaces it. A deadline cannot be cleared, so null is rejected.",
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
}
},
"required": [
"id"
],
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"record": {
"type": "object",
"properties": {
"objective": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Deadline; null when no deadline has been set."
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Progress. Derived from measurable results, independently of Status."
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Historical progress at the resolved last-session boundary; not current Progress."
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"cycle_id",
"title",
"description",
"deadline_at",
"status",
"created_at",
"short_code",
"url",
"progress_pct",
"boundary_progress_pct",
"movement_pp"
],
"additionalProperties": false
},
"cycle": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
},
"results": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"boundary_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 1
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"boundary_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Start. Metric baseline; habit baselines are derived rather than stored."
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
}
]
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"actions": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Due. May be unset on a web draft; a set date cannot be cleared."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"sort_order": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Drag order within an action group; not a progress status."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"overdue": {
"type": "boolean"
},
"done_since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"cycle_id",
"objective_id",
"title",
"description",
"due_at",
"status",
"sort_order",
"session_id",
"created_at",
"url",
"overdue",
"done_since_boundary"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"objective",
"cycle",
"results",
"actions",
"continuations"
],
"additionalProperties": false
},
"changed": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"entity": {
"type": "string",
"enum": [
"user",
"cycle",
"objective",
"result",
"result_log",
"action",
"action_log",
"session",
"note",
"habit_log"
]
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"entity",
"id"
],
"additionalProperties": false
}
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"record",
"changed",
"continuations"
],
"additionalProperties": false
}[
{
"tool": "objective_write",
"collection": "objectives",
"specification": "docs/feature-specs/F3-objectives.md#mcp-source-mapping--selected-target",
"operation": "update",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"objectives.update"
],
"gap": null,
"projection": "Project record.objective and changed on writes; list uses resolved cycle_id for continuations; get returns objective only.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"description": {
"type": "string"
},
"deadline_at": {
"description": "UI label: Deadline. Optional; omitted or null creates the objective with no deadline.",
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
]
},
"operation": {
"type": "string",
"const": "create"
}
},
"required": [
"title",
"description",
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string",
"minLength": 1
},
"description": {
"type": "string"
},
"deadline_at": {
"description": "UI label: Deadline. Omit to preserve; a date sets or replaces it. A deadline cannot be cleared, so null is rejected.",
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
},
"operation": {
"type": "string",
"const": "update"
}
},
"required": [
"id",
"operation"
],
"additionalProperties": false
}
]
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"objective": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Deadline; null when no deadline has been set."
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Progress. Derived from measurable results, independently of Status."
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Historical progress at the resolved last-session boundary; not current Progress."
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"cycle_id",
"title",
"description",
"deadline_at",
"status",
"created_at",
"short_code",
"url",
"progress_pct",
"boundary_progress_pct",
"movement_pp"
],
"additionalProperties": false
},
"changed": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"entity": {
"type": "string",
"enum": [
"user",
"cycle",
"objective",
"result",
"result_log",
"action",
"action_log",
"session",
"note",
"habit_log"
]
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"entity",
"id"
],
"additionalProperties": false
}
}
},
"required": [
"objective",
"changed"
],
"additionalProperties": false
}
}
]Feature declaration: deleteObjective
Requirement: docs/feature-specs/F3-objectives.md · Access: entitled-write
Tables: objectives (delete)
Trusted context: authenticated actor
Retry: Inspect state after uncertain outcomes; never infer rollback from a response failure.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "objectives.delete",
"service": "objectives.delete",
"binding": "bound"
}
][
{
"tool": "objective_delete",
"collection": "objectives",
"specification": "docs/feature-specs/F3-objectives.md#mcp-source-mapping--selected-target",
"operation": "commit",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"objectives.delete"
],
"gap": null,
"projection": "Project record.objective and changed on writes; list uses resolved cycle_id for continuations; get returns objective only."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"preview_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Server impact preview ID; trusted application approval must already exist."
}
},
"required": [
"id",
"preview_id"
],
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"id"
],
"additionalProperties": false
}[
{
"tool": "objective_delete",
"collection": "objectives",
"specification": "docs/feature-specs/F3-objectives.md#mcp-source-mapping--selected-target",
"operation": "commit",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"objectives.delete"
],
"gap": null,
"projection": "Project record.objective and changed on writes; list uses resolved cycle_id for continuations; get returns objective only.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "preview"
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Exact owned record UUID. Resolve ambiguous targets before requesting impact."
}
},
"required": [
"operation",
"id"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "commit"
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"preview_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Server preview ID for this target. Not consent: genuine approval must already be recorded by the trusted application."
}
},
"required": [
"operation",
"id",
"preview_id"
],
"additionalProperties": false
}
]
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "preview"
},
"preview_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"expires_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"target": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
}
},
"required": [
"id",
"title"
],
"additionalProperties": false
},
"deleted": {
"type": "object",
"properties": {
"objectives": {
"type": "number",
"const": 1
},
"results": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"result_logs": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"habit_logs": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"actions": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"action_logs": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"objectives",
"results",
"result_logs",
"habit_logs",
"actions",
"action_logs"
],
"additionalProperties": false
},
"approval": {
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "required"
},
"url": {
"type": "string",
"format": "uri"
}
},
"required": [
"status",
"url"
],
"additionalProperties": false
}
},
"required": [
"operation",
"preview_id",
"expires_at",
"target",
"deleted",
"approval"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "commit"
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"operation",
"id"
],
"additionalProperties": false
}
]
}
}
]Feature declaration: readResultHistory
Requirement: docs/feature-specs/F4-results.md · Access: retained-read
Tables: results (read), result_logs (read), habit_logs (read)
Trusted context: authenticated actor
Retry: Safe to retry with the same resolved filters and cursor.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[]
[
{
"tool": "result_read",
"collection": "results",
"specification": "docs/feature-specs/F4-results.md#mcp-source-mapping--selected-target",
"operation": "history",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"results.history"
],
"gap": null,
"projection": "Project record.result and changed on writes; history preserves its resolved window, kind and cursor; list preserves parent/attention filters."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 100
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"kind": {
"type": "string",
"enum": [
"result_logs",
"habit_logs",
"trend"
],
"description": "Evidence stream to page; get returns current figures regardless of this window."
},
"window": {
"type": "object",
"properties": {
"since": {
"description": "Inclusive lower bound. Default: last completed session, falling back to active-cycle start. Date-only values use the profile timezone.",
"anyOf": [
{
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
]
},
{
"type": "string",
"enum": [
"last_session",
"cycle_start"
]
}
]
},
"until": {
"description": "Exclusive upper bound; default is the server time captured on the first page.",
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
]
}
},
"additionalProperties": false
}
},
"required": [
"result_id",
"kind"
],
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"comment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"result_id",
"value",
"comment",
"session_id",
"recorded_at"
],
"additionalProperties": false,
"description": "Result log stored in result_logs. The UI shows value entries under Updates and their non-empty comments under Comments. Value may be null for a comment-only habit entry; evidence and timestamps are immutable."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"kind": {
"type": "string",
"const": "result_logs"
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"window": {
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
}
},
"required": [
"items",
"next_cursor",
"kind",
"result_id",
"window"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"day": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"result_id",
"day",
"session_id",
"created_at"
],
"additionalProperties": false,
"description": "Habit log stored in habit_logs. The UI marks calendar days and lists them under Updates with the Marked column. One row per result/day; unmarking deletes the row. This is not append-only history."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"kind": {
"type": "string",
"const": "habit_logs"
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"window": {
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
}
},
"required": [
"items",
"next_cursor",
"kind",
"result_id",
"window"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "value"
},
"at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"value": {
"type": "number"
},
"pace": {
"type": "number"
}
},
"required": [
"kind",
"at",
"value",
"pace"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "habit"
},
"from": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"to": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"actual": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"expected": {
"type": "number"
},
"expected_full": {
"type": "number"
}
},
"required": [
"kind",
"from",
"to",
"actual",
"expected",
"expected_full"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "performance"
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"value": {
"type": "number"
},
"target": {
"type": "number"
},
"gap": {
"type": "number"
},
"share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"kind",
"id",
"at",
"value",
"target",
"gap",
"share"
],
"additionalProperties": false
}
]
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"kind": {
"type": "string",
"const": "trend"
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"window": {
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
}
},
"required": [
"items",
"next_cursor",
"kind",
"result_id",
"window"
],
"additionalProperties": false
}
]
}[
{
"tool": "result_read",
"collection": "results",
"specification": "docs/feature-specs/F4-results.md#mcp-source-mapping--selected-target",
"operation": "history",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"results.history"
],
"gap": null,
"projection": "Project record.result and changed on writes; history preserves its resolved window, kind and cursor; list preserves parent/attention filters.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 100
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"description": "List results across one cycle instead of a single objective. Supply exactly one parent selector.",
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"attention": {
"description": "Optional briefing subset: no evidence ever, no update in the window, or habit with no mark in the window.",
"type": "string",
"enum": [
"never_updated",
"silent",
"unmarked"
]
},
"window": {
"description": "Required for silent/unmarked attention. Use exact server-resolved briefing bounds; current result figures remain current.",
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "get"
}
},
"required": [
"id",
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 100
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "history"
},
"kind": {
"type": "string",
"enum": [
"result_logs",
"habit_logs",
"trend"
],
"description": "Evidence stream to page; get returns current figures regardless of this window."
},
"window": {
"type": "object",
"properties": {
"since": {
"description": "Inclusive lower bound. Default: last completed session, falling back to active-cycle start. Date-only values use the profile timezone.",
"anyOf": [
{
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
]
},
{
"type": "string",
"enum": [
"last_session",
"cycle_start"
]
}
]
},
"until": {
"description": "Exclusive upper bound; default is the server time captured on the first page.",
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
]
}
},
"additionalProperties": false
}
},
"required": [
"result_id",
"operation",
"kind"
],
"additionalProperties": false
}
]
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"anyOf": [
{
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"boundary_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 1
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"boundary_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Start. Metric baseline; habit baselines are derived rather than stored."
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
}
]
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"continuation": {
"anyOf": [
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"const": "result_read"
},
"arguments": {
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"description": "List results across one cycle instead of a single objective. Supply exactly one parent selector.",
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"attention": {
"description": "Optional briefing subset: no evidence ever, no update in the window, or habit with no mark in the window.",
"type": "string",
"enum": [
"never_updated",
"silent",
"unmarked"
]
},
"window": {
"description": "Required for silent/unmarked attention. Use exact server-resolved briefing bounds; current result figures remain current.",
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"cursor",
"limit",
"operation"
],
"additionalProperties": false
}
},
"required": [
"tool",
"arguments"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"items",
"next_cursor",
"continuation",
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "get"
},
"result": {
"oneOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"boundary_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 1
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"boundary_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Start. Metric baseline; habit baselines are derived rather than stored."
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
}
]
}
},
"required": [
"operation",
"result"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"comment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"result_id",
"value",
"comment",
"session_id",
"recorded_at"
],
"additionalProperties": false,
"description": "Result log stored in result_logs. The UI shows value entries under Updates and their non-empty comments under Comments. Value may be null for a comment-only habit entry; evidence and timestamps are immutable."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"continuation": {
"anyOf": [
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"const": "result_read"
},
"arguments": {
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "history"
},
"kind": {
"type": "string",
"const": "result_logs"
},
"window": {
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
}
},
"required": [
"cursor",
"limit",
"result_id",
"operation",
"kind",
"window"
],
"additionalProperties": false
}
},
"required": [
"tool",
"arguments"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"operation": {
"type": "string",
"const": "history"
},
"kind": {
"type": "string",
"const": "result_logs"
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"window": {
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
}
},
"required": [
"items",
"next_cursor",
"continuation",
"operation",
"kind",
"result_id",
"window"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"day": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"result_id",
"day",
"session_id",
"created_at"
],
"additionalProperties": false,
"description": "Habit log stored in habit_logs. The UI marks calendar days and lists them under Updates with the Marked column. One row per result/day; unmarking deletes the row. This is not append-only history."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"continuation": {
"anyOf": [
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"const": "result_read"
},
"arguments": {
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "history"
},
"kind": {
"type": "string",
"const": "habit_logs"
},
"window": {
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
}
},
"required": [
"cursor",
"limit",
"result_id",
"operation",
"kind",
"window"
],
"additionalProperties": false
}
},
"required": [
"tool",
"arguments"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"operation": {
"type": "string",
"const": "history"
},
"kind": {
"type": "string",
"const": "habit_logs"
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"window": {
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
}
},
"required": [
"items",
"next_cursor",
"continuation",
"operation",
"kind",
"result_id",
"window"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "value"
},
"at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"value": {
"type": "number"
},
"pace": {
"type": "number"
}
},
"required": [
"kind",
"at",
"value",
"pace"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "habit"
},
"from": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"to": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"actual": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"expected": {
"type": "number"
},
"expected_full": {
"type": "number"
}
},
"required": [
"kind",
"from",
"to",
"actual",
"expected",
"expected_full"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "performance"
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"value": {
"type": "number"
},
"target": {
"type": "number"
},
"gap": {
"type": "number"
},
"share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"kind",
"id",
"at",
"value",
"target",
"gap",
"share"
],
"additionalProperties": false
}
]
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"continuation": {
"anyOf": [
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"const": "result_read"
},
"arguments": {
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "history"
},
"kind": {
"type": "string",
"const": "trend"
},
"window": {
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
}
},
"required": [
"cursor",
"limit",
"result_id",
"operation",
"kind",
"window"
],
"additionalProperties": false
}
},
"required": [
"tool",
"arguments"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"operation": {
"type": "string",
"const": "history"
},
"kind": {
"type": "string",
"const": "trend"
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"window": {
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
}
},
"required": [
"items",
"next_cursor",
"continuation",
"operation",
"kind",
"result_id",
"window"
],
"additionalProperties": false
}
]
}
}
]Feature declaration: previewResultDeletion
Requirement: docs/feature-specs/F4-results.md · Access: entitled-write
Tables: results (read), result_logs (read), habit_logs (read)
Trusted context: authenticated actor
Retry: Preview does not authorize deletion. Commit rechecks actor, target, impact, expiry and application approval; incomplete impact fails closed.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "results.preview_deletion",
"service": "results.preview_deletion",
"binding": "bound"
}
][
{
"tool": "result_delete",
"collection": "results",
"specification": "docs/feature-specs/F4-results.md#mcp-source-mapping--selected-target",
"operation": "preview",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"results.preview_deletion"
],
"gap": null,
"projection": "Project record.result and changed on writes; history preserves its resolved window, kind and cursor; list preserves parent/attention filters."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"id"
],
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "preview"
},
"preview_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"expires_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"target": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
}
},
"required": [
"id",
"title"
],
"additionalProperties": false
},
"deleted": {
"type": "object",
"properties": {
"results": {
"type": "number",
"const": 1
},
"result_logs": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"habit_logs": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"results",
"result_logs",
"habit_logs"
],
"additionalProperties": false
},
"approval": {
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "required"
},
"url": {
"type": "string",
"format": "uri"
}
},
"required": [
"status",
"url"
],
"additionalProperties": false
}
},
"required": [
"operation",
"preview_id",
"expires_at",
"target",
"deleted",
"approval"
],
"additionalProperties": false
}[
{
"tool": "result_delete",
"collection": "results",
"specification": "docs/feature-specs/F4-results.md#mcp-source-mapping--selected-target",
"operation": "preview",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"results.preview_deletion"
],
"gap": null,
"projection": "Project record.result and changed on writes; history preserves its resolved window, kind and cursor; list preserves parent/attention filters.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "preview"
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Exact owned record UUID. Resolve ambiguous targets before requesting impact."
}
},
"required": [
"operation",
"id"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "commit"
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"preview_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Server preview ID for this target. Not consent: genuine approval must already be recorded by the trusted application."
}
},
"required": [
"operation",
"id",
"preview_id"
],
"additionalProperties": false
}
]
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "preview"
},
"preview_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"expires_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"target": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
}
},
"required": [
"id",
"title"
],
"additionalProperties": false
},
"deleted": {
"type": "object",
"properties": {
"results": {
"type": "number",
"const": 1
},
"result_logs": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"habit_logs": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"results",
"result_logs",
"habit_logs"
],
"additionalProperties": false
},
"approval": {
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "required"
},
"url": {
"type": "string",
"format": "uri"
}
},
"required": [
"status",
"url"
],
"additionalProperties": false
}
},
"required": [
"operation",
"preview_id",
"expires_at",
"target",
"deleted",
"approval"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "commit"
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"operation",
"id"
],
"additionalProperties": false
}
]
}
}
]Feature declaration: createResult
Requirement: docs/feature-specs/F4-results.md · Access: entitled-write
Tables: results (write), cycles (read), objectives (read), result_logs (read), habit_logs (read), idempotency_keys (write)
Trusted context: authenticated actor
Retry: API requires client-key replay; unkeyed MCP calls must inspect state after an uncertain outcome.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "results.create",
"service": "results.create",
"binding": "bound"
}
][
{
"tool": "result_write",
"collection": "results",
"specification": "docs/feature-specs/F4-results.md#mcp-source-mapping--selected-target",
"operation": "create",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"results.create"
],
"gap": null,
"projection": "Project record.result and changed on writes; history preserves its resolved window, kind and cursor; list preserves parent/attention filters."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"anyOf": [
{
"oneOf": [
{
"type": "object",
"properties": {
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"idempotency_key": {
"type": "string",
"minLength": 1,
"maxLength": 255
}
},
"required": [
"objective_id",
"title",
"metric_type",
"target_value",
"idempotency_key"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"idempotency_key": {
"type": "string",
"minLength": 1,
"maxLength": 255
}
},
"required": [
"objective_id",
"title",
"metric_type",
"target_value",
"idempotency_key"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
},
"idempotency_key": {
"type": "string",
"minLength": 1,
"maxLength": 255
}
},
"required": [
"objective_id",
"title",
"metric_type",
"idempotency_key"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991,
"description": "UI label: Times per selected Cadence."
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"idempotency_key": {
"type": "string",
"minLength": 1,
"maxLength": 255
}
},
"required": [
"objective_id",
"title",
"metric_type",
"cadence",
"per",
"idempotency_key"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"idempotency_key": {
"type": "string",
"minLength": 1,
"maxLength": 255
}
},
"required": [
"objective_id",
"title",
"metric_type",
"target_value",
"idempotency_key"
],
"additionalProperties": false
}
]
},
{
"oneOf": [
{
"type": "object",
"properties": {
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"objective_id",
"title",
"metric_type",
"target_value"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
}
},
"required": [
"objective_id",
"title",
"metric_type",
"target_value"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
}
},
"required": [
"objective_id",
"title",
"metric_type"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991,
"description": "UI label: Times per selected Cadence."
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
}
},
"required": [
"objective_id",
"title",
"metric_type",
"cadence",
"per"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
}
},
"required": [
"objective_id",
"title",
"metric_type",
"target_value"
],
"additionalProperties": false
}
]
}
]
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"record": {
"type": "object",
"properties": {
"result": {
"oneOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"boundary_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 1
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"boundary_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Start. Metric baseline; habit baselines are derived rather than stored."
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
}
]
},
"parents": {
"type": "object",
"properties": {
"cycle": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"objectives": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Deadline; null when no deadline has been set."
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Progress. Derived from measurable results, independently of Status."
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Historical progress at the resolved last-session boundary; not current Progress."
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"cycle_id",
"title",
"description",
"deadline_at",
"status",
"created_at",
"short_code",
"url",
"progress_pct",
"boundary_progress_pct",
"movement_pp"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
}
},
"required": [
"cycle",
"objectives"
],
"additionalProperties": false
},
"result_logs": {
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"comment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"result_id",
"value",
"comment",
"session_id",
"recorded_at"
],
"additionalProperties": false,
"description": "Result log stored in result_logs. The UI shows value entries under Updates and their non-empty comments under Comments. Value may be null for a comment-only habit entry; evidence and timestamps are immutable."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"habit_logs": {
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"day": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"result_id",
"day",
"session_id",
"created_at"
],
"additionalProperties": false,
"description": "Habit log stored in habit_logs. The UI marks calendar days and lists them under Updates with the Marked column. One row per result/day; unmarking deletes the row. This is not append-only history."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"trend": {
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "value"
},
"at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"value": {
"type": "number"
},
"pace": {
"type": "number"
}
},
"required": [
"kind",
"at",
"value",
"pace"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "habit"
},
"from": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"to": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"actual": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"expected": {
"type": "number"
},
"expected_full": {
"type": "number"
}
},
"required": [
"kind",
"from",
"to",
"actual",
"expected",
"expected_full"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "performance"
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"value": {
"type": "number"
},
"target": {
"type": "number"
},
"gap": {
"type": "number"
},
"share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"kind",
"id",
"at",
"value",
"target",
"gap",
"share"
],
"additionalProperties": false
}
]
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"result",
"parents",
"result_logs",
"habit_logs",
"trend",
"continuations"
],
"additionalProperties": false
},
"changed": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"entity": {
"type": "string",
"enum": [
"user",
"cycle",
"objective",
"result",
"result_log",
"action",
"action_log",
"session",
"note",
"habit_log"
]
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"entity",
"id"
],
"additionalProperties": false
}
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"record",
"changed",
"continuations"
],
"additionalProperties": false
}[
{
"tool": "result_write",
"collection": "results",
"specification": "docs/feature-specs/F4-results.md#mcp-source-mapping--selected-target",
"operation": "create",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"results.create"
],
"gap": null,
"projection": "Project record.result and changed on writes; history preserves its resolved window, kind and cursor; list preserves parent/attention filters.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"oneOf": [
{
"type": "object",
"properties": {
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string",
"minLength": 1
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"operation": {
"type": "string",
"const": "create"
}
},
"required": [
"objective_id",
"title",
"metric_type",
"target_value",
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string",
"minLength": 1
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"operation": {
"type": "string",
"const": "create"
}
},
"required": [
"objective_id",
"title",
"metric_type",
"target_value",
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string",
"minLength": 1
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
},
"operation": {
"type": "string",
"const": "create"
}
},
"required": [
"objective_id",
"title",
"metric_type",
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string",
"minLength": 1
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991,
"description": "UI label: Times per selected Cadence."
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"operation": {
"type": "string",
"const": "create"
}
},
"required": [
"objective_id",
"title",
"metric_type",
"cadence",
"per",
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string",
"minLength": 1
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"operation": {
"type": "string",
"const": "create"
}
},
"required": [
"objective_id",
"title",
"metric_type",
"target_value",
"operation"
],
"additionalProperties": false
}
]
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string",
"minLength": 1
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"metric_type": {
"type": "string",
"enum": [
"number",
"percentage",
"milestone",
"habit",
"performance"
],
"description": "UI label: Type. Number, Percentage, Milestone, Habit or Performance."
},
"target_value": {
"type": "number"
},
"start_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991,
"description": "UI label: Times per selected Cadence."
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"operation": {
"type": "string",
"const": "update"
}
},
"required": [
"id",
"operation"
],
"additionalProperties": false
}
]
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"result": {
"oneOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"boundary_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 1
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"boundary_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Start. Metric baseline; habit baselines are derived rather than stored."
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
}
]
},
"changed": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"entity": {
"type": "string",
"enum": [
"user",
"cycle",
"objective",
"result",
"result_log",
"action",
"action_log",
"session",
"note",
"habit_log"
]
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"entity",
"id"
],
"additionalProperties": false
}
}
},
"required": [
"result",
"changed"
],
"additionalProperties": false
}
}
]Feature declaration: listResults
Requirement: docs/feature-specs/F4-results.md · Access: retained-read
Tables: results (read), cycles (read)
Trusted context: authenticated actor
Retry: Safe to retry with the same resolved filters and cursor.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "results.list",
"service": "results.list",
"binding": "bound"
}
][
{
"tool": "result_read",
"collection": "results",
"specification": "docs/feature-specs/F4-results.md#mcp-source-mapping--selected-target",
"operation": "list",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"results.list"
],
"gap": null,
"projection": "Project record.result and changed on writes; history preserves its resolved window, kind and cursor; list preserves parent/attention filters."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 100
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"description": "List results across one cycle instead of a single objective. Supply exactly one parent selector.",
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"attention": {
"description": "Optional briefing subset: no evidence ever, no update in the window, or habit with no mark in the window.",
"type": "string",
"enum": [
"never_updated",
"silent",
"unmarked"
]
},
"window": {
"description": "Required for silent/unmarked attention. Use exact server-resolved briefing bounds; current result figures remain current.",
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
}
},
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"boundary_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 1
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"boundary_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Start. Metric baseline; habit baselines are derived rather than stored."
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
}
]
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
}[
{
"tool": "result_read",
"collection": "results",
"specification": "docs/feature-specs/F4-results.md#mcp-source-mapping--selected-target",
"operation": "list",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"results.list"
],
"gap": null,
"projection": "Project record.result and changed on writes; history preserves its resolved window, kind and cursor; list preserves parent/attention filters.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 100
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"description": "List results across one cycle instead of a single objective. Supply exactly one parent selector.",
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"attention": {
"description": "Optional briefing subset: no evidence ever, no update in the window, or habit with no mark in the window.",
"type": "string",
"enum": [
"never_updated",
"silent",
"unmarked"
]
},
"window": {
"description": "Required for silent/unmarked attention. Use exact server-resolved briefing bounds; current result figures remain current.",
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "get"
}
},
"required": [
"id",
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 100
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "history"
},
"kind": {
"type": "string",
"enum": [
"result_logs",
"habit_logs",
"trend"
],
"description": "Evidence stream to page; get returns current figures regardless of this window."
},
"window": {
"type": "object",
"properties": {
"since": {
"description": "Inclusive lower bound. Default: last completed session, falling back to active-cycle start. Date-only values use the profile timezone.",
"anyOf": [
{
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
]
},
{
"type": "string",
"enum": [
"last_session",
"cycle_start"
]
}
]
},
"until": {
"description": "Exclusive upper bound; default is the server time captured on the first page.",
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
]
}
},
"additionalProperties": false
}
},
"required": [
"result_id",
"operation",
"kind"
],
"additionalProperties": false
}
]
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"anyOf": [
{
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"boundary_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 1
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"boundary_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Start. Metric baseline; habit baselines are derived rather than stored."
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
}
]
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"continuation": {
"anyOf": [
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"const": "result_read"
},
"arguments": {
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"description": "List results across one cycle instead of a single objective. Supply exactly one parent selector.",
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"attention": {
"description": "Optional briefing subset: no evidence ever, no update in the window, or habit with no mark in the window.",
"type": "string",
"enum": [
"never_updated",
"silent",
"unmarked"
]
},
"window": {
"description": "Required for silent/unmarked attention. Use exact server-resolved briefing bounds; current result figures remain current.",
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"cursor",
"limit",
"operation"
],
"additionalProperties": false
}
},
"required": [
"tool",
"arguments"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"items",
"next_cursor",
"continuation",
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "get"
},
"result": {
"oneOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"boundary_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 1
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"boundary_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Start. Metric baseline; habit baselines are derived rather than stored."
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
}
]
}
},
"required": [
"operation",
"result"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"comment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"result_id",
"value",
"comment",
"session_id",
"recorded_at"
],
"additionalProperties": false,
"description": "Result log stored in result_logs. The UI shows value entries under Updates and their non-empty comments under Comments. Value may be null for a comment-only habit entry; evidence and timestamps are immutable."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"continuation": {
"anyOf": [
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"const": "result_read"
},
"arguments": {
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "history"
},
"kind": {
"type": "string",
"const": "result_logs"
},
"window": {
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
}
},
"required": [
"cursor",
"limit",
"result_id",
"operation",
"kind",
"window"
],
"additionalProperties": false
}
},
"required": [
"tool",
"arguments"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"operation": {
"type": "string",
"const": "history"
},
"kind": {
"type": "string",
"const": "result_logs"
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"window": {
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
}
},
"required": [
"items",
"next_cursor",
"continuation",
"operation",
"kind",
"result_id",
"window"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"day": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"result_id",
"day",
"session_id",
"created_at"
],
"additionalProperties": false,
"description": "Habit log stored in habit_logs. The UI marks calendar days and lists them under Updates with the Marked column. One row per result/day; unmarking deletes the row. This is not append-only history."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"continuation": {
"anyOf": [
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"const": "result_read"
},
"arguments": {
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "history"
},
"kind": {
"type": "string",
"const": "habit_logs"
},
"window": {
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
}
},
"required": [
"cursor",
"limit",
"result_id",
"operation",
"kind",
"window"
],
"additionalProperties": false
}
},
"required": [
"tool",
"arguments"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"operation": {
"type": "string",
"const": "history"
},
"kind": {
"type": "string",
"const": "habit_logs"
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"window": {
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
}
},
"required": [
"items",
"next_cursor",
"continuation",
"operation",
"kind",
"result_id",
"window"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "value"
},
"at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"value": {
"type": "number"
},
"pace": {
"type": "number"
}
},
"required": [
"kind",
"at",
"value",
"pace"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "habit"
},
"from": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"to": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"actual": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"expected": {
"type": "number"
},
"expected_full": {
"type": "number"
}
},
"required": [
"kind",
"from",
"to",
"actual",
"expected",
"expected_full"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "performance"
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"value": {
"type": "number"
},
"target": {
"type": "number"
},
"gap": {
"type": "number"
},
"share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"kind",
"id",
"at",
"value",
"target",
"gap",
"share"
],
"additionalProperties": false
}
]
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"continuation": {
"anyOf": [
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"const": "result_read"
},
"arguments": {
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "history"
},
"kind": {
"type": "string",
"const": "trend"
},
"window": {
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
}
},
"required": [
"cursor",
"limit",
"result_id",
"operation",
"kind",
"window"
],
"additionalProperties": false
}
},
"required": [
"tool",
"arguments"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"operation": {
"type": "string",
"const": "history"
},
"kind": {
"type": "string",
"const": "trend"
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"window": {
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
}
},
"required": [
"items",
"next_cursor",
"continuation",
"operation",
"kind",
"result_id",
"window"
],
"additionalProperties": false
}
]
}
}
]Feature declaration: getResult
Requirement: docs/feature-specs/F4-results.md · Access: retained-read
Tables: results (read), cycles (read), objectives (read), result_logs (read), habit_logs (read)
Trusted context: authenticated actor
Retry: Safe to retry with the same resolved filters and cursor.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "results.get",
"service": "results.get",
"binding": "bound"
}
][
{
"tool": "result_read",
"collection": "results",
"specification": "docs/feature-specs/F4-results.md#mcp-source-mapping--selected-target",
"operation": "get",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"results.get"
],
"gap": null,
"projection": "Project record.result and changed on writes; history preserves its resolved window, kind and cursor; list preserves parent/attention filters."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"id"
],
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"result": {
"oneOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"boundary_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 1
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"boundary_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Start. Metric baseline; habit baselines are derived rather than stored."
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
}
]
},
"parents": {
"type": "object",
"properties": {
"cycle": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"objectives": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Deadline; null when no deadline has been set."
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Progress. Derived from measurable results, independently of Status."
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Historical progress at the resolved last-session boundary; not current Progress."
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"cycle_id",
"title",
"description",
"deadline_at",
"status",
"created_at",
"short_code",
"url",
"progress_pct",
"boundary_progress_pct",
"movement_pp"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
}
},
"required": [
"cycle",
"objectives"
],
"additionalProperties": false
},
"result_logs": {
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"comment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"result_id",
"value",
"comment",
"session_id",
"recorded_at"
],
"additionalProperties": false,
"description": "Result log stored in result_logs. The UI shows value entries under Updates and their non-empty comments under Comments. Value may be null for a comment-only habit entry; evidence and timestamps are immutable."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"habit_logs": {
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"day": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"result_id",
"day",
"session_id",
"created_at"
],
"additionalProperties": false,
"description": "Habit log stored in habit_logs. The UI marks calendar days and lists them under Updates with the Marked column. One row per result/day; unmarking deletes the row. This is not append-only history."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"trend": {
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "value"
},
"at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"value": {
"type": "number"
},
"pace": {
"type": "number"
}
},
"required": [
"kind",
"at",
"value",
"pace"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "habit"
},
"from": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"to": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"actual": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"expected": {
"type": "number"
},
"expected_full": {
"type": "number"
}
},
"required": [
"kind",
"from",
"to",
"actual",
"expected",
"expected_full"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "performance"
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"value": {
"type": "number"
},
"target": {
"type": "number"
},
"gap": {
"type": "number"
},
"share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"kind",
"id",
"at",
"value",
"target",
"gap",
"share"
],
"additionalProperties": false
}
]
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"result",
"parents",
"result_logs",
"habit_logs",
"trend",
"continuations"
],
"additionalProperties": false
}[
{
"tool": "result_read",
"collection": "results",
"specification": "docs/feature-specs/F4-results.md#mcp-source-mapping--selected-target",
"operation": "get",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"results.get"
],
"gap": null,
"projection": "Project record.result and changed on writes; history preserves its resolved window, kind and cursor; list preserves parent/attention filters.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 100
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"description": "List results across one cycle instead of a single objective. Supply exactly one parent selector.",
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"attention": {
"description": "Optional briefing subset: no evidence ever, no update in the window, or habit with no mark in the window.",
"type": "string",
"enum": [
"never_updated",
"silent",
"unmarked"
]
},
"window": {
"description": "Required for silent/unmarked attention. Use exact server-resolved briefing bounds; current result figures remain current.",
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "get"
}
},
"required": [
"id",
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 100
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "history"
},
"kind": {
"type": "string",
"enum": [
"result_logs",
"habit_logs",
"trend"
],
"description": "Evidence stream to page; get returns current figures regardless of this window."
},
"window": {
"type": "object",
"properties": {
"since": {
"description": "Inclusive lower bound. Default: last completed session, falling back to active-cycle start. Date-only values use the profile timezone.",
"anyOf": [
{
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
]
},
{
"type": "string",
"enum": [
"last_session",
"cycle_start"
]
}
]
},
"until": {
"description": "Exclusive upper bound; default is the server time captured on the first page.",
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
]
}
},
"additionalProperties": false
}
},
"required": [
"result_id",
"operation",
"kind"
],
"additionalProperties": false
}
]
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"anyOf": [
{
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"boundary_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 1
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"boundary_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Start. Metric baseline; habit baselines are derived rather than stored."
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
}
]
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"continuation": {
"anyOf": [
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"const": "result_read"
},
"arguments": {
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"description": "List results across one cycle instead of a single objective. Supply exactly one parent selector.",
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"attention": {
"description": "Optional briefing subset: no evidence ever, no update in the window, or habit with no mark in the window.",
"type": "string",
"enum": [
"never_updated",
"silent",
"unmarked"
]
},
"window": {
"description": "Required for silent/unmarked attention. Use exact server-resolved briefing bounds; current result figures remain current.",
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"cursor",
"limit",
"operation"
],
"additionalProperties": false
}
},
"required": [
"tool",
"arguments"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"items",
"next_cursor",
"continuation",
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "get"
},
"result": {
"oneOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"boundary_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 1
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"boundary_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Start. Metric baseline; habit baselines are derived rather than stored."
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
}
]
}
},
"required": [
"operation",
"result"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"comment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"result_id",
"value",
"comment",
"session_id",
"recorded_at"
],
"additionalProperties": false,
"description": "Result log stored in result_logs. The UI shows value entries under Updates and their non-empty comments under Comments. Value may be null for a comment-only habit entry; evidence and timestamps are immutable."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"continuation": {
"anyOf": [
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"const": "result_read"
},
"arguments": {
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "history"
},
"kind": {
"type": "string",
"const": "result_logs"
},
"window": {
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
}
},
"required": [
"cursor",
"limit",
"result_id",
"operation",
"kind",
"window"
],
"additionalProperties": false
}
},
"required": [
"tool",
"arguments"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"operation": {
"type": "string",
"const": "history"
},
"kind": {
"type": "string",
"const": "result_logs"
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"window": {
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
}
},
"required": [
"items",
"next_cursor",
"continuation",
"operation",
"kind",
"result_id",
"window"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"day": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"result_id",
"day",
"session_id",
"created_at"
],
"additionalProperties": false,
"description": "Habit log stored in habit_logs. The UI marks calendar days and lists them under Updates with the Marked column. One row per result/day; unmarking deletes the row. This is not append-only history."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"continuation": {
"anyOf": [
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"const": "result_read"
},
"arguments": {
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "history"
},
"kind": {
"type": "string",
"const": "habit_logs"
},
"window": {
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
}
},
"required": [
"cursor",
"limit",
"result_id",
"operation",
"kind",
"window"
],
"additionalProperties": false
}
},
"required": [
"tool",
"arguments"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"operation": {
"type": "string",
"const": "history"
},
"kind": {
"type": "string",
"const": "habit_logs"
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"window": {
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
}
},
"required": [
"items",
"next_cursor",
"continuation",
"operation",
"kind",
"result_id",
"window"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "value"
},
"at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"value": {
"type": "number"
},
"pace": {
"type": "number"
}
},
"required": [
"kind",
"at",
"value",
"pace"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "habit"
},
"from": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"to": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"actual": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"expected": {
"type": "number"
},
"expected_full": {
"type": "number"
}
},
"required": [
"kind",
"from",
"to",
"actual",
"expected",
"expected_full"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "performance"
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"value": {
"type": "number"
},
"target": {
"type": "number"
},
"gap": {
"type": "number"
},
"share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"kind",
"id",
"at",
"value",
"target",
"gap",
"share"
],
"additionalProperties": false
}
]
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"continuation": {
"anyOf": [
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"const": "result_read"
},
"arguments": {
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "history"
},
"kind": {
"type": "string",
"const": "trend"
},
"window": {
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
}
},
"required": [
"cursor",
"limit",
"result_id",
"operation",
"kind",
"window"
],
"additionalProperties": false
}
},
"required": [
"tool",
"arguments"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"operation": {
"type": "string",
"const": "history"
},
"kind": {
"type": "string",
"const": "trend"
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"window": {
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
}
},
"required": [
"items",
"next_cursor",
"continuation",
"operation",
"kind",
"result_id",
"window"
],
"additionalProperties": false
}
]
}
}
]Feature declaration: updateResult
Requirement: docs/feature-specs/F4-results.md · Access: entitled-write
Tables: results (write), cycles (read), objectives (read), result_logs (read), habit_logs (read)
Trusted context: authenticated actor
Retry: Inspect state after uncertain outcomes; never infer rollback from a response failure.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "results.update",
"service": "results.update",
"binding": "bound"
}
][
{
"tool": "result_write",
"collection": "results",
"specification": "docs/feature-specs/F4-results.md#mcp-source-mapping--selected-target",
"operation": "update",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"results.update"
],
"gap": null,
"projection": "Project record.result and changed on writes; history preserves its resolved window, kind and cursor; list preserves parent/attention filters."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"metric_type": {
"type": "string",
"enum": [
"number",
"percentage",
"milestone",
"habit",
"performance"
],
"description": "UI label: Type. Number, Percentage, Milestone, Habit or Performance."
},
"target_value": {
"type": "number"
},
"start_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991,
"description": "UI label: Times per selected Cadence."
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
}
},
"required": [
"id"
],
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"record": {
"type": "object",
"properties": {
"result": {
"oneOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"boundary_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 1
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"boundary_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Start. Metric baseline; habit baselines are derived rather than stored."
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
}
]
},
"parents": {
"type": "object",
"properties": {
"cycle": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"objectives": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Deadline; null when no deadline has been set."
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Progress. Derived from measurable results, independently of Status."
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Historical progress at the resolved last-session boundary; not current Progress."
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"cycle_id",
"title",
"description",
"deadline_at",
"status",
"created_at",
"short_code",
"url",
"progress_pct",
"boundary_progress_pct",
"movement_pp"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
}
},
"required": [
"cycle",
"objectives"
],
"additionalProperties": false
},
"result_logs": {
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"comment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"result_id",
"value",
"comment",
"session_id",
"recorded_at"
],
"additionalProperties": false,
"description": "Result log stored in result_logs. The UI shows value entries under Updates and their non-empty comments under Comments. Value may be null for a comment-only habit entry; evidence and timestamps are immutable."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"habit_logs": {
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"day": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"result_id",
"day",
"session_id",
"created_at"
],
"additionalProperties": false,
"description": "Habit log stored in habit_logs. The UI marks calendar days and lists them under Updates with the Marked column. One row per result/day; unmarking deletes the row. This is not append-only history."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"trend": {
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "value"
},
"at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"value": {
"type": "number"
},
"pace": {
"type": "number"
}
},
"required": [
"kind",
"at",
"value",
"pace"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "habit"
},
"from": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"to": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"actual": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"expected": {
"type": "number"
},
"expected_full": {
"type": "number"
}
},
"required": [
"kind",
"from",
"to",
"actual",
"expected",
"expected_full"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "performance"
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"value": {
"type": "number"
},
"target": {
"type": "number"
},
"gap": {
"type": "number"
},
"share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"kind",
"id",
"at",
"value",
"target",
"gap",
"share"
],
"additionalProperties": false
}
]
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"result",
"parents",
"result_logs",
"habit_logs",
"trend",
"continuations"
],
"additionalProperties": false
},
"changed": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"entity": {
"type": "string",
"enum": [
"user",
"cycle",
"objective",
"result",
"result_log",
"action",
"action_log",
"session",
"note",
"habit_log"
]
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"entity",
"id"
],
"additionalProperties": false
}
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"record",
"changed",
"continuations"
],
"additionalProperties": false
}[
{
"tool": "result_write",
"collection": "results",
"specification": "docs/feature-specs/F4-results.md#mcp-source-mapping--selected-target",
"operation": "update",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"results.update"
],
"gap": null,
"projection": "Project record.result and changed on writes; history preserves its resolved window, kind and cursor; list preserves parent/attention filters.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"oneOf": [
{
"type": "object",
"properties": {
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string",
"minLength": 1
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"operation": {
"type": "string",
"const": "create"
}
},
"required": [
"objective_id",
"title",
"metric_type",
"target_value",
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string",
"minLength": 1
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"operation": {
"type": "string",
"const": "create"
}
},
"required": [
"objective_id",
"title",
"metric_type",
"target_value",
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string",
"minLength": 1
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
},
"operation": {
"type": "string",
"const": "create"
}
},
"required": [
"objective_id",
"title",
"metric_type",
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string",
"minLength": 1
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991,
"description": "UI label: Times per selected Cadence."
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"operation": {
"type": "string",
"const": "create"
}
},
"required": [
"objective_id",
"title",
"metric_type",
"cadence",
"per",
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string",
"minLength": 1
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"operation": {
"type": "string",
"const": "create"
}
},
"required": [
"objective_id",
"title",
"metric_type",
"target_value",
"operation"
],
"additionalProperties": false
}
]
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string",
"minLength": 1
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"metric_type": {
"type": "string",
"enum": [
"number",
"percentage",
"milestone",
"habit",
"performance"
],
"description": "UI label: Type. Number, Percentage, Milestone, Habit or Performance."
},
"target_value": {
"type": "number"
},
"start_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991,
"description": "UI label: Times per selected Cadence."
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"operation": {
"type": "string",
"const": "update"
}
},
"required": [
"id",
"operation"
],
"additionalProperties": false
}
]
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"result": {
"oneOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"boundary_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 1
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"boundary_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Start. Metric baseline; habit baselines are derived rather than stored."
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
}
]
},
"changed": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"entity": {
"type": "string",
"enum": [
"user",
"cycle",
"objective",
"result",
"result_log",
"action",
"action_log",
"session",
"note",
"habit_log"
]
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"entity",
"id"
],
"additionalProperties": false
}
}
},
"required": [
"result",
"changed"
],
"additionalProperties": false
}
}
]Feature declaration: deleteResult
Requirement: docs/feature-specs/F4-results.md · Access: entitled-write
Tables: results (delete)
Trusted context: authenticated actor
Retry: Inspect state after uncertain outcomes; never infer rollback from a response failure.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "results.delete",
"service": "results.delete",
"binding": "bound"
}
][
{
"tool": "result_delete",
"collection": "results",
"specification": "docs/feature-specs/F4-results.md#mcp-source-mapping--selected-target",
"operation": "commit",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"results.delete"
],
"gap": null,
"projection": "Project record.result and changed on writes; history preserves its resolved window, kind and cursor; list preserves parent/attention filters."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"preview_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Server impact preview ID; trusted application approval must already exist."
}
},
"required": [
"id",
"preview_id"
],
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"id"
],
"additionalProperties": false
}[
{
"tool": "result_delete",
"collection": "results",
"specification": "docs/feature-specs/F4-results.md#mcp-source-mapping--selected-target",
"operation": "commit",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"results.delete"
],
"gap": null,
"projection": "Project record.result and changed on writes; history preserves its resolved window, kind and cursor; list preserves parent/attention filters.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "preview"
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Exact owned record UUID. Resolve ambiguous targets before requesting impact."
}
},
"required": [
"operation",
"id"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "commit"
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"preview_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Server preview ID for this target. Not consent: genuine approval must already be recorded by the trusted application."
}
},
"required": [
"operation",
"id",
"preview_id"
],
"additionalProperties": false
}
]
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "preview"
},
"preview_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"expires_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"target": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
}
},
"required": [
"id",
"title"
],
"additionalProperties": false
},
"deleted": {
"type": "object",
"properties": {
"results": {
"type": "number",
"const": 1
},
"result_logs": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"habit_logs": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"results",
"result_logs",
"habit_logs"
],
"additionalProperties": false
},
"approval": {
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "required"
},
"url": {
"type": "string",
"format": "uri"
}
},
"required": [
"status",
"url"
],
"additionalProperties": false
}
},
"required": [
"operation",
"preview_id",
"expires_at",
"target",
"deleted",
"approval"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "commit"
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"operation",
"id"
],
"additionalProperties": false
}
]
}
}
]Feature declaration: createResultLog
Requirement: docs/feature-specs/F4-results.md · Access: entitled-write
Tables: result_logs (write), results (read), cycles (read), objectives (read), habit_logs (read), idempotency_keys (write)
Trusted context: authenticated actor
Retry: API requires client-key replay; unkeyed MCP calls must inspect state after an uncertain outcome.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "result_logs.create",
"service": "result_logs.create",
"binding": "bound"
}
][
{
"tool": "progress_record",
"collection": "progress",
"specification": "docs/feature-specs/F4-results.md#mcp-source-mapping--selected-target",
"operation": "result",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"result_logs.create"
],
"gap": null,
"projection": "Dispatch result evidence, habit day/comment and action outcome to their existing shared operations; project the affected record and changed IDs."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"anyOf": [
{
"type": "object",
"properties": {
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"value": {
"type": "number"
},
"comment": {
"type": "string",
"minLength": 1
},
"idempotency_key": {
"type": "string",
"minLength": 1,
"maxLength": 255
}
},
"required": [
"result_id",
"idempotency_key"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"value": {
"type": "number"
},
"comment": {
"type": "string",
"minLength": 1
}
},
"required": [
"result_id"
],
"additionalProperties": false
}
]
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"record": {
"type": "object",
"properties": {
"result": {
"oneOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"boundary_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 1
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"boundary_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Start. Metric baseline; habit baselines are derived rather than stored."
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
}
]
},
"parents": {
"type": "object",
"properties": {
"cycle": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"objectives": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Deadline; null when no deadline has been set."
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Progress. Derived from measurable results, independently of Status."
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Historical progress at the resolved last-session boundary; not current Progress."
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"cycle_id",
"title",
"description",
"deadline_at",
"status",
"created_at",
"short_code",
"url",
"progress_pct",
"boundary_progress_pct",
"movement_pp"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
}
},
"required": [
"cycle",
"objectives"
],
"additionalProperties": false
},
"result_logs": {
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"comment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"result_id",
"value",
"comment",
"session_id",
"recorded_at"
],
"additionalProperties": false,
"description": "Result log stored in result_logs. The UI shows value entries under Updates and their non-empty comments under Comments. Value may be null for a comment-only habit entry; evidence and timestamps are immutable."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"habit_logs": {
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"day": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"result_id",
"day",
"session_id",
"created_at"
],
"additionalProperties": false,
"description": "Habit log stored in habit_logs. The UI marks calendar days and lists them under Updates with the Marked column. One row per result/day; unmarking deletes the row. This is not append-only history."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"trend": {
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "value"
},
"at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"value": {
"type": "number"
},
"pace": {
"type": "number"
}
},
"required": [
"kind",
"at",
"value",
"pace"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "habit"
},
"from": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"to": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"actual": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"expected": {
"type": "number"
},
"expected_full": {
"type": "number"
}
},
"required": [
"kind",
"from",
"to",
"actual",
"expected",
"expected_full"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "performance"
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"value": {
"type": "number"
},
"target": {
"type": "number"
},
"gap": {
"type": "number"
},
"share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"kind",
"id",
"at",
"value",
"target",
"gap",
"share"
],
"additionalProperties": false
}
]
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"result",
"parents",
"result_logs",
"habit_logs",
"trend",
"continuations"
],
"additionalProperties": false
},
"changed": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"entity": {
"type": "string",
"enum": [
"user",
"cycle",
"objective",
"result",
"result_log",
"action",
"action_log",
"session",
"note",
"habit_log"
]
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"entity",
"id"
],
"additionalProperties": false
}
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"record",
"changed",
"continuations"
],
"additionalProperties": false
}[
{
"tool": "progress_record",
"collection": "progress",
"specification": "docs/feature-specs/F4-results.md#mcp-source-mapping--selected-target",
"operation": "result",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"result_logs.create"
],
"gap": null,
"projection": "Dispatch result evidence, habit day/comment and action outcome to their existing shared operations; project the affected record and changed IDs.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"anyOf": [
{
"anyOf": [
{
"type": "object",
"properties": {
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"value": {
"type": "number"
},
"comment": {
"type": "string",
"minLength": 1
},
"target": {
"type": "string",
"const": "result"
}
},
"required": [
"result_id",
"target"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"comment": {
"type": "string",
"minLength": 1
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"day": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"marked": {
"type": "boolean",
"description": "Desired calendar state: true marks the day; false unmarks it. Not an append-only history event."
},
"target": {
"type": "string",
"const": "result"
}
},
"required": [
"result_id",
"day",
"marked",
"target"
],
"additionalProperties": false
}
]
},
{
"type": "object",
"properties": {
"action_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"comment": {
"type": "string",
"minLength": 1
},
"target": {
"type": "string",
"const": "action"
}
},
"required": [
"action_id",
"status",
"target"
],
"additionalProperties": false
}
]
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"anyOf": [
{
"type": "object",
"properties": {
"result": {
"oneOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"boundary_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 1
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"boundary_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Start. Metric baseline; habit baselines are derived rather than stored."
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
}
]
},
"changed": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"entity": {
"type": "string",
"enum": [
"user",
"cycle",
"objective",
"result",
"result_log",
"action",
"action_log",
"session",
"note",
"habit_log"
]
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"entity",
"id"
],
"additionalProperties": false
}
}
},
"required": [
"result",
"changed"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"action": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Due. May be unset on a web draft; a set date cannot be cleared."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"sort_order": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Drag order within an action group; not a progress status."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"overdue": {
"type": "boolean"
},
"done_since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"cycle_id",
"objective_id",
"title",
"description",
"due_at",
"status",
"sort_order",
"session_id",
"created_at",
"url",
"overdue",
"done_since_boundary"
],
"additionalProperties": false
},
"changed": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"entity": {
"type": "string",
"enum": [
"user",
"cycle",
"objective",
"result",
"result_log",
"action",
"action_log",
"session",
"note",
"habit_log"
]
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"entity",
"id"
],
"additionalProperties": false
}
}
},
"required": [
"action",
"changed"
],
"additionalProperties": false
}
]
}
}
]Feature declaration: listResultLogs
Requirement: docs/feature-specs/F4-results.md · Access: retained-read
Tables: result_logs (read)
Trusted context: authenticated actor
Retry: Safe to retry with the same resolved filters and cursor.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "result_logs.list",
"service": "result_logs.list",
"binding": "bound"
}
][]
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 100
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"result_id"
],
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"comment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"result_id",
"value",
"comment",
"session_id",
"recorded_at"
],
"additionalProperties": false,
"description": "Result log stored in result_logs. The UI shows value entries under Updates and their non-empty comments under Comments. Value may be null for a comment-only habit entry; evidence and timestamps are immutable."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
}[]
Feature declaration: clearResultLogComment
Requirement: docs/feature-specs/F4-results.md · Access: entitled-write
Tables: result_logs (write), results (read), cycles (read), objectives (read), habit_logs (read)
Trusted context: authenticated actor
Retry: Inspect state after uncertain outcomes; never infer rollback from a response failure.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "result_logs.clear_comment",
"service": "result_logs.clear_comment",
"binding": "bound"
}
][]
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"id"
],
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"record": {
"type": "object",
"properties": {
"result": {
"oneOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"boundary_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 1
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"boundary_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Start. Metric baseline; habit baselines are derived rather than stored."
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
}
]
},
"parents": {
"type": "object",
"properties": {
"cycle": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"objectives": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Deadline; null when no deadline has been set."
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Progress. Derived from measurable results, independently of Status."
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Historical progress at the resolved last-session boundary; not current Progress."
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"cycle_id",
"title",
"description",
"deadline_at",
"status",
"created_at",
"short_code",
"url",
"progress_pct",
"boundary_progress_pct",
"movement_pp"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
}
},
"required": [
"cycle",
"objectives"
],
"additionalProperties": false
},
"result_logs": {
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"comment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"result_id",
"value",
"comment",
"session_id",
"recorded_at"
],
"additionalProperties": false,
"description": "Result log stored in result_logs. The UI shows value entries under Updates and their non-empty comments under Comments. Value may be null for a comment-only habit entry; evidence and timestamps are immutable."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"habit_logs": {
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"day": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"result_id",
"day",
"session_id",
"created_at"
],
"additionalProperties": false,
"description": "Habit log stored in habit_logs. The UI marks calendar days and lists them under Updates with the Marked column. One row per result/day; unmarking deletes the row. This is not append-only history."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"trend": {
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "value"
},
"at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"value": {
"type": "number"
},
"pace": {
"type": "number"
}
},
"required": [
"kind",
"at",
"value",
"pace"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "habit"
},
"from": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"to": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"actual": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"expected": {
"type": "number"
},
"expected_full": {
"type": "number"
}
},
"required": [
"kind",
"from",
"to",
"actual",
"expected",
"expected_full"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "performance"
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"value": {
"type": "number"
},
"target": {
"type": "number"
},
"gap": {
"type": "number"
},
"share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"kind",
"id",
"at",
"value",
"target",
"gap",
"share"
],
"additionalProperties": false
}
]
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"result",
"parents",
"result_logs",
"habit_logs",
"trend",
"continuations"
],
"additionalProperties": false
},
"changed": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"entity": {
"type": "string",
"enum": [
"user",
"cycle",
"objective",
"result",
"result_log",
"action",
"action_log",
"session",
"note",
"habit_log"
]
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"entity",
"id"
],
"additionalProperties": false
}
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"record",
"changed",
"continuations"
],
"additionalProperties": false
}[]
Feature declaration: deleteResultLog
Requirement: docs/feature-specs/F4-results.md · Access: entitled-write
Tables: result_logs (delete), results (read), cycles (read), objectives (read), habit_logs (read)
Trusted context: authenticated actor
Retry: Inspect state after uncertain outcomes; never infer rollback from a response failure.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "result_logs.delete",
"service": "result_logs.delete",
"binding": "bound"
}
][]
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"id"
],
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"record": {
"type": "object",
"properties": {
"result": {
"oneOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"boundary_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 1
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"boundary_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Start. Metric baseline; habit baselines are derived rather than stored."
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
}
]
},
"parents": {
"type": "object",
"properties": {
"cycle": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"objectives": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Deadline; null when no deadline has been set."
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Progress. Derived from measurable results, independently of Status."
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Historical progress at the resolved last-session boundary; not current Progress."
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"cycle_id",
"title",
"description",
"deadline_at",
"status",
"created_at",
"short_code",
"url",
"progress_pct",
"boundary_progress_pct",
"movement_pp"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
}
},
"required": [
"cycle",
"objectives"
],
"additionalProperties": false
},
"result_logs": {
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"comment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"result_id",
"value",
"comment",
"session_id",
"recorded_at"
],
"additionalProperties": false,
"description": "Result log stored in result_logs. The UI shows value entries under Updates and their non-empty comments under Comments. Value may be null for a comment-only habit entry; evidence and timestamps are immutable."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"habit_logs": {
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"day": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"result_id",
"day",
"session_id",
"created_at"
],
"additionalProperties": false,
"description": "Habit log stored in habit_logs. The UI marks calendar days and lists them under Updates with the Marked column. One row per result/day; unmarking deletes the row. This is not append-only history."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"trend": {
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "value"
},
"at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"value": {
"type": "number"
},
"pace": {
"type": "number"
}
},
"required": [
"kind",
"at",
"value",
"pace"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "habit"
},
"from": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"to": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"actual": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"expected": {
"type": "number"
},
"expected_full": {
"type": "number"
}
},
"required": [
"kind",
"from",
"to",
"actual",
"expected",
"expected_full"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "performance"
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"value": {
"type": "number"
},
"target": {
"type": "number"
},
"gap": {
"type": "number"
},
"share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"kind",
"id",
"at",
"value",
"target",
"gap",
"share"
],
"additionalProperties": false
}
]
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"result",
"parents",
"result_logs",
"habit_logs",
"trend",
"continuations"
],
"additionalProperties": false
},
"changed": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"entity": {
"type": "string",
"enum": [
"user",
"cycle",
"objective",
"result",
"result_log",
"action",
"action_log",
"session",
"note",
"habit_log"
]
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"entity",
"id"
],
"additionalProperties": false
}
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"record",
"changed",
"continuations"
],
"additionalProperties": false
}[]
Feature declaration: setHabitLog
Requirement: docs/feature-specs/F4-results.md · Access: entitled-write
Tables: habit_logs (write), results (read), cycles (read), objectives (read), result_logs (read)
Trusted context: authenticated actor
Retry: Repeated desired day state is safe; a comment is evidence and must not be blindly repeated.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "habit_logs.set",
"service": "habit_logs.set",
"binding": "bound"
}
][
{
"tool": "progress_record",
"collection": "progress",
"specification": "docs/feature-specs/F4-results.md#mcp-source-mapping--selected-target",
"operation": "habit",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"habit_logs.set"
],
"gap": null,
"projection": "Dispatch result evidence, habit day/comment and action outcome to their existing shared operations; project the affected record and changed IDs."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"comment": {
"description": "Optional evidence comment saved atomically with the requested habit day state.",
"type": "string",
"minLength": 1
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"day": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"marked": {
"type": "boolean",
"description": "Desired calendar state: true marks the day; false unmarks it. Not an append-only history event."
}
},
"required": [
"result_id",
"day",
"marked"
],
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"record": {
"type": "object",
"properties": {
"result": {
"oneOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"boundary_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 1
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"boundary_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Start. Metric baseline; habit baselines are derived rather than stored."
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
}
]
},
"parents": {
"type": "object",
"properties": {
"cycle": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"objectives": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Deadline; null when no deadline has been set."
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Progress. Derived from measurable results, independently of Status."
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Historical progress at the resolved last-session boundary; not current Progress."
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"cycle_id",
"title",
"description",
"deadline_at",
"status",
"created_at",
"short_code",
"url",
"progress_pct",
"boundary_progress_pct",
"movement_pp"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
}
},
"required": [
"cycle",
"objectives"
],
"additionalProperties": false
},
"result_logs": {
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"comment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"result_id",
"value",
"comment",
"session_id",
"recorded_at"
],
"additionalProperties": false,
"description": "Result log stored in result_logs. The UI shows value entries under Updates and their non-empty comments under Comments. Value may be null for a comment-only habit entry; evidence and timestamps are immutable."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"habit_logs": {
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"day": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"result_id",
"day",
"session_id",
"created_at"
],
"additionalProperties": false,
"description": "Habit log stored in habit_logs. The UI marks calendar days and lists them under Updates with the Marked column. One row per result/day; unmarking deletes the row. This is not append-only history."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"trend": {
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "value"
},
"at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"value": {
"type": "number"
},
"pace": {
"type": "number"
}
},
"required": [
"kind",
"at",
"value",
"pace"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "habit"
},
"from": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"to": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"actual": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"expected": {
"type": "number"
},
"expected_full": {
"type": "number"
}
},
"required": [
"kind",
"from",
"to",
"actual",
"expected",
"expected_full"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "performance"
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"value": {
"type": "number"
},
"target": {
"type": "number"
},
"gap": {
"type": "number"
},
"share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"kind",
"id",
"at",
"value",
"target",
"gap",
"share"
],
"additionalProperties": false
}
]
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"result",
"parents",
"result_logs",
"habit_logs",
"trend",
"continuations"
],
"additionalProperties": false
},
"changed": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"entity": {
"type": "string",
"enum": [
"user",
"cycle",
"objective",
"result",
"result_log",
"action",
"action_log",
"session",
"note",
"habit_log"
]
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"entity",
"id"
],
"additionalProperties": false
}
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"record",
"changed",
"continuations"
],
"additionalProperties": false
}[
{
"tool": "progress_record",
"collection": "progress",
"specification": "docs/feature-specs/F4-results.md#mcp-source-mapping--selected-target",
"operation": "habit",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"habit_logs.set"
],
"gap": null,
"projection": "Dispatch result evidence, habit day/comment and action outcome to their existing shared operations; project the affected record and changed IDs.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"anyOf": [
{
"anyOf": [
{
"type": "object",
"properties": {
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"value": {
"type": "number"
},
"comment": {
"type": "string",
"minLength": 1
},
"target": {
"type": "string",
"const": "result"
}
},
"required": [
"result_id",
"target"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"comment": {
"type": "string",
"minLength": 1
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"day": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"marked": {
"type": "boolean",
"description": "Desired calendar state: true marks the day; false unmarks it. Not an append-only history event."
},
"target": {
"type": "string",
"const": "result"
}
},
"required": [
"result_id",
"day",
"marked",
"target"
],
"additionalProperties": false
}
]
},
{
"type": "object",
"properties": {
"action_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"comment": {
"type": "string",
"minLength": 1
},
"target": {
"type": "string",
"const": "action"
}
},
"required": [
"action_id",
"status",
"target"
],
"additionalProperties": false
}
]
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"anyOf": [
{
"type": "object",
"properties": {
"result": {
"oneOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"boundary_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 1
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"boundary_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Start. Metric baseline; habit baselines are derived rather than stored."
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
}
]
},
"changed": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"entity": {
"type": "string",
"enum": [
"user",
"cycle",
"objective",
"result",
"result_log",
"action",
"action_log",
"session",
"note",
"habit_log"
]
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"entity",
"id"
],
"additionalProperties": false
}
}
},
"required": [
"result",
"changed"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"action": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Due. May be unset on a web draft; a set date cannot be cleared."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"sort_order": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Drag order within an action group; not a progress status."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"overdue": {
"type": "boolean"
},
"done_since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"cycle_id",
"objective_id",
"title",
"description",
"due_at",
"status",
"sort_order",
"session_id",
"created_at",
"url",
"overdue",
"done_since_boundary"
],
"additionalProperties": false
},
"changed": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"entity": {
"type": "string",
"enum": [
"user",
"cycle",
"objective",
"result",
"result_log",
"action",
"action_log",
"session",
"note",
"habit_log"
]
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"entity",
"id"
],
"additionalProperties": false
}
}
},
"required": [
"action",
"changed"
],
"additionalProperties": false
}
]
}
}
]Feature declaration: listHabitLogs
Requirement: docs/feature-specs/F4-results.md · Access: retained-read
Tables: habit_logs (read)
Trusted context: authenticated actor
Retry: Safe to retry with the same resolved filters and cursor.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "habit_logs.list",
"service": "habit_logs.list",
"binding": "bound"
}
][]
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 100
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"from": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"to": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
}
},
"required": [
"result_id"
],
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"day": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"result_id",
"day",
"session_id",
"created_at"
],
"additionalProperties": false,
"description": "Habit log stored in habit_logs. The UI marks calendar days and lists them under Updates with the Marked column. One row per result/day; unmarking deletes the row. This is not append-only history."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
}[]
Feature declaration: readActionHistory
Requirement: docs/feature-specs/F5-actions.md · Access: retained-read
Tables: actions (read), action_logs (read)
Trusted context: authenticated actor
Retry: Safe to retry with the same resolved filters and cursor.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[]
[
{
"tool": "action_read",
"collection": "actions",
"specification": "docs/feature-specs/F5-actions.md#mcp-source-mapping--selected-target",
"operation": "history",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"actions.history"
],
"gap": null,
"projection": "Project record.action and changed on writes; list uses resolved cycle_id and original filters; history preserves its resolved window."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 100
},
"action_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"window": {
"type": "object",
"properties": {
"since": {
"description": "Inclusive lower bound. Default: last completed session, falling back to active-cycle start. Date-only values use the profile timezone.",
"anyOf": [
{
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
]
},
{
"type": "string",
"enum": [
"last_session",
"cycle_start"
]
}
]
},
"until": {
"description": "Exclusive upper bound; default is the server time captured on the first page.",
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
]
}
},
"additionalProperties": false
}
},
"required": [
"action_id"
],
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"action_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"comment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"action_id",
"status",
"comment",
"session_id",
"recorded_at"
],
"additionalProperties": false,
"description": "Action log stored in action_logs. Records a status observation and optional comment. Action detail shows Comments, a filtered view rather than the complete status history; status and timestamps are immutable, and only the comment may be cleared."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"action_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"window": {
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
}
},
"required": [
"items",
"next_cursor",
"action_id",
"window"
],
"additionalProperties": false
}[
{
"tool": "action_read",
"collection": "actions",
"specification": "docs/feature-specs/F5-actions.md#mcp-source-mapping--selected-target",
"operation": "history",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"actions.history"
],
"gap": null,
"projection": "Project record.action and changed on writes; list uses resolved cycle_id and original filters; history preserves its resolved window.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 100
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"due_before": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"outstanding": {
"description": "Only open or in_progress actions; exclude done across every page.",
"type": "boolean",
"const": true
},
"session_id": {
"description": "Filter actions created in this owned session; combine with cycle_id to select its cycle explicitly.",
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"overdue": {
"description": "Only non-done actions before due_before; requires an explicit local cutoff date for stable briefing pagination.",
"type": "boolean",
"const": true
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "get"
}
},
"required": [
"id",
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 100
},
"action_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "history"
},
"window": {
"type": "object",
"properties": {
"since": {
"description": "Inclusive lower bound. Default: last completed session, falling back to active-cycle start. Date-only values use the profile timezone.",
"anyOf": [
{
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
]
},
{
"type": "string",
"enum": [
"last_session",
"cycle_start"
]
}
]
},
"until": {
"description": "Exclusive upper bound; default is the server time captured on the first page.",
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
]
}
},
"additionalProperties": false
}
},
"required": [
"action_id",
"operation"
],
"additionalProperties": false
}
]
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"anyOf": [
{
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Due. May be unset on a web draft; a set date cannot be cleared."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"sort_order": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Drag order within an action group; not a progress status."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"overdue": {
"type": "boolean"
},
"done_since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"cycle_id",
"objective_id",
"title",
"description",
"due_at",
"status",
"sort_order",
"session_id",
"created_at",
"url",
"overdue",
"done_since_boundary"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"continuation": {
"anyOf": [
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"const": "action_read"
},
"arguments": {
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"due_before": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"outstanding": {
"description": "Only open or in_progress actions; exclude done across every page.",
"type": "boolean",
"const": true
},
"session_id": {
"description": "Filter actions created in this owned session; combine with cycle_id to select its cycle explicitly.",
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"overdue": {
"description": "Only non-done actions before due_before; requires an explicit local cutoff date for stable briefing pagination.",
"type": "boolean",
"const": true
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"cursor",
"limit",
"cycle_id",
"operation"
],
"additionalProperties": false
}
},
"required": [
"tool",
"arguments"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"items",
"next_cursor",
"continuation",
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "get"
},
"action": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Due. May be unset on a web draft; a set date cannot be cleared."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"sort_order": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Drag order within an action group; not a progress status."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"overdue": {
"type": "boolean"
},
"done_since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"cycle_id",
"objective_id",
"title",
"description",
"due_at",
"status",
"sort_order",
"session_id",
"created_at",
"url",
"overdue",
"done_since_boundary"
],
"additionalProperties": false
}
},
"required": [
"operation",
"action"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"action_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"comment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"action_id",
"status",
"comment",
"session_id",
"recorded_at"
],
"additionalProperties": false,
"description": "Action log stored in action_logs. Records a status observation and optional comment. Action detail shows Comments, a filtered view rather than the complete status history; status and timestamps are immutable, and only the comment may be cleared."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"continuation": {
"anyOf": [
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"const": "action_read"
},
"arguments": {
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"action_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "history"
},
"window": {
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
}
},
"required": [
"cursor",
"limit",
"action_id",
"operation",
"window"
],
"additionalProperties": false
}
},
"required": [
"tool",
"arguments"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"operation": {
"type": "string",
"const": "history"
},
"action_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"window": {
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
}
},
"required": [
"items",
"next_cursor",
"continuation",
"operation",
"action_id",
"window"
],
"additionalProperties": false
}
]
}
}
]Feature declaration: previewActionDeletion
Requirement: docs/feature-specs/F5-actions.md · Access: entitled-write
Tables: actions (read), action_logs (read)
Trusted context: authenticated actor
Retry: Preview does not authorize deletion. Commit rechecks actor, target, impact, expiry and application approval; incomplete impact fails closed.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "actions.preview_deletion",
"service": "actions.preview_deletion",
"binding": "bound"
}
][
{
"tool": "action_delete",
"collection": "actions",
"specification": "docs/feature-specs/F5-actions.md#mcp-source-mapping--selected-target",
"operation": "preview",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"actions.preview_deletion"
],
"gap": null,
"projection": "Project record.action and changed on writes; list uses resolved cycle_id and original filters; history preserves its resolved window."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"id"
],
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "preview"
},
"preview_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"expires_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"target": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
}
},
"required": [
"id",
"title"
],
"additionalProperties": false
},
"deleted": {
"type": "object",
"properties": {
"actions": {
"type": "number",
"const": 1
},
"action_logs": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"actions",
"action_logs"
],
"additionalProperties": false
},
"approval": {
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "required"
},
"url": {
"type": "string",
"format": "uri"
}
},
"required": [
"status",
"url"
],
"additionalProperties": false
}
},
"required": [
"operation",
"preview_id",
"expires_at",
"target",
"deleted",
"approval"
],
"additionalProperties": false
}[
{
"tool": "action_delete",
"collection": "actions",
"specification": "docs/feature-specs/F5-actions.md#mcp-source-mapping--selected-target",
"operation": "preview",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"actions.preview_deletion"
],
"gap": null,
"projection": "Project record.action and changed on writes; list uses resolved cycle_id and original filters; history preserves its resolved window.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "preview"
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Exact owned record UUID. Resolve ambiguous targets before requesting impact."
}
},
"required": [
"operation",
"id"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "commit"
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"preview_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Server preview ID for this target. Not consent: genuine approval must already be recorded by the trusted application."
}
},
"required": [
"operation",
"id",
"preview_id"
],
"additionalProperties": false
}
]
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "preview"
},
"preview_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"expires_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"target": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
}
},
"required": [
"id",
"title"
],
"additionalProperties": false
},
"deleted": {
"type": "object",
"properties": {
"actions": {
"type": "number",
"const": 1
},
"action_logs": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"actions",
"action_logs"
],
"additionalProperties": false
},
"approval": {
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "required"
},
"url": {
"type": "string",
"format": "uri"
}
},
"required": [
"status",
"url"
],
"additionalProperties": false
}
},
"required": [
"operation",
"preview_id",
"expires_at",
"target",
"deleted",
"approval"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "commit"
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"operation",
"id"
],
"additionalProperties": false
}
]
}
}
]Feature declaration: createAction
Requirement: docs/feature-specs/F5-actions.md · Access: entitled-write
Tables: actions (write), cycles (read), objectives (read), sessions (read), action_logs (read), idempotency_keys (write)
Trusted context: authenticated actor
Retry: API requires client-key replay; unkeyed MCP calls must inspect state after an uncertain outcome.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "actions.create",
"service": "actions.create",
"binding": "bound"
}
][
{
"tool": "action_write",
"collection": "actions",
"specification": "docs/feature-specs/F5-actions.md#mcp-source-mapping--selected-target",
"operation": "create",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"actions.create"
],
"gap": null,
"projection": "Project record.action and changed on writes; list uses resolved cycle_id and original filters; history preserves its resolved window."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"anyOf": [
{
"type": "object",
"properties": {
"title": {
"type": "string"
},
"due_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
]
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"idempotency_key": {
"type": "string",
"minLength": 1,
"maxLength": 255
}
},
"required": [
"title",
"due_at",
"idempotency_key"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"title": {
"type": "string"
},
"due_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
]
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"title",
"due_at"
],
"additionalProperties": false
}
]
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"record": {
"type": "object",
"properties": {
"action": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Due. May be unset on a web draft; a set date cannot be cleared."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"sort_order": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Drag order within an action group; not a progress status."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"overdue": {
"type": "boolean"
},
"done_since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"cycle_id",
"objective_id",
"title",
"description",
"due_at",
"status",
"sort_order",
"session_id",
"created_at",
"url",
"overdue",
"done_since_boundary"
],
"additionalProperties": false
},
"cycle": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
},
"objective": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Deadline; null when no deadline has been set."
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Progress. Derived from measurable results, independently of Status."
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Historical progress at the resolved last-session boundary; not current Progress."
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"cycle_id",
"title",
"description",
"deadline_at",
"status",
"created_at",
"short_code",
"url",
"progress_pct",
"boundary_progress_pct",
"movement_pp"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"source_session": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"vendor": {
"type": "string",
"enum": [
"claude",
"openai"
],
"description": "Conversation host: claude is shown as Claude; openai is shown as ChatGPT."
},
"source_url": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "External conversation link used by Open the conversation. Not the app detail URL."
},
"type": {
"anyOf": [
{
"type": "string",
"enum": [
"goal_setup",
"check_in",
"review",
"open_coaching"
],
"description": "Coaching session type: Goal setup, Check-in, Review or Open coaching. Separate from whether the session is still open."
},
{
"type": "null"
}
]
},
"briefing_notes": {
"type": "string",
"description": "UI document: Briefing. Server-prepared coaching context."
},
"headline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "One-line coaching-session summary used in session lists."
},
"summary_notes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI document: Summary. Saved when the coaching session closes."
},
"started_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"ended_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
],
"description": "Closed when set; In progress when null. This is derived session state, not a stored status enum."
},
"url": {
"type": "string",
"format": "uri",
"description": "Internal app link to coaching session details; distinct from source_url."
},
"duration_minutes": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"actions_created": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"actions_reviewed": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"id",
"vendor",
"source_url",
"type",
"briefing_notes",
"headline",
"summary_notes",
"started_at",
"ended_at",
"url",
"duration_minutes",
"actions_created",
"actions_reviewed"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"action_logs": {
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"action_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"comment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"action_id",
"status",
"comment",
"session_id",
"recorded_at"
],
"additionalProperties": false,
"description": "Action log stored in action_logs. Records a status observation and optional comment. Action detail shows Comments, a filtered view rather than the complete status history; status and timestamps are immutable, and only the comment may be cleared."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"action",
"cycle",
"objective",
"source_session",
"action_logs",
"continuations"
],
"additionalProperties": false
},
"changed": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"entity": {
"type": "string",
"enum": [
"user",
"cycle",
"objective",
"result",
"result_log",
"action",
"action_log",
"session",
"note",
"habit_log"
]
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"entity",
"id"
],
"additionalProperties": false
}
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"record",
"changed",
"continuations"
],
"additionalProperties": false
}[
{
"tool": "action_write",
"collection": "actions",
"specification": "docs/feature-specs/F5-actions.md#mcp-source-mapping--selected-target",
"operation": "create",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"actions.create"
],
"gap": null,
"projection": "Project record.action and changed on writes; list uses resolved cycle_id and original filters; history preserves its resolved window.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"due_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"operation": {
"type": "string",
"const": "create"
}
},
"required": [
"title",
"due_at",
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string",
"minLength": 1
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"description": "New due date. Omit to preserve; a previously set date cannot be cleared.",
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"operation": {
"type": "string",
"const": "update"
}
},
"required": [
"id",
"operation"
],
"additionalProperties": false
}
]
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"action": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Due. May be unset on a web draft; a set date cannot be cleared."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"sort_order": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Drag order within an action group; not a progress status."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"overdue": {
"type": "boolean"
},
"done_since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"cycle_id",
"objective_id",
"title",
"description",
"due_at",
"status",
"sort_order",
"session_id",
"created_at",
"url",
"overdue",
"done_since_boundary"
],
"additionalProperties": false
},
"changed": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"entity": {
"type": "string",
"enum": [
"user",
"cycle",
"objective",
"result",
"result_log",
"action",
"action_log",
"session",
"note",
"habit_log"
]
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"entity",
"id"
],
"additionalProperties": false
}
}
},
"required": [
"action",
"changed"
],
"additionalProperties": false
}
}
]Feature declaration: listActions
Requirement: docs/feature-specs/F5-actions.md · Access: retained-read
Tables: actions (read)
Trusted context: authenticated actor
Retry: Safe to retry with the same resolved filters and cursor.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "actions.list",
"service": "actions.list",
"binding": "bound"
}
][
{
"tool": "action_read",
"collection": "actions",
"specification": "docs/feature-specs/F5-actions.md#mcp-source-mapping--selected-target",
"operation": "list",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"actions.list"
],
"gap": null,
"projection": "Project record.action and changed on writes; list uses resolved cycle_id and original filters; history preserves its resolved window."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 100
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"due_before": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"outstanding": {
"description": "Only open or in_progress actions; exclude done across every page.",
"type": "boolean",
"const": true
},
"session_id": {
"description": "Filter actions created in this owned session; combine with cycle_id to select its cycle explicitly.",
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"overdue": {
"description": "Only non-done actions before due_before; requires an explicit local cutoff date for stable briefing pagination.",
"type": "boolean",
"const": true
}
},
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Due. May be unset on a web draft; a set date cannot be cleared."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"sort_order": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Drag order within an action group; not a progress status."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"overdue": {
"type": "boolean"
},
"done_since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"cycle_id",
"objective_id",
"title",
"description",
"due_at",
"status",
"sort_order",
"session_id",
"created_at",
"url",
"overdue",
"done_since_boundary"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"cycle_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor",
"cycle_id"
],
"additionalProperties": false
}[
{
"tool": "action_read",
"collection": "actions",
"specification": "docs/feature-specs/F5-actions.md#mcp-source-mapping--selected-target",
"operation": "list",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"actions.list"
],
"gap": null,
"projection": "Project record.action and changed on writes; list uses resolved cycle_id and original filters; history preserves its resolved window.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 100
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"due_before": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"outstanding": {
"description": "Only open or in_progress actions; exclude done across every page.",
"type": "boolean",
"const": true
},
"session_id": {
"description": "Filter actions created in this owned session; combine with cycle_id to select its cycle explicitly.",
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"overdue": {
"description": "Only non-done actions before due_before; requires an explicit local cutoff date for stable briefing pagination.",
"type": "boolean",
"const": true
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "get"
}
},
"required": [
"id",
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 100
},
"action_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "history"
},
"window": {
"type": "object",
"properties": {
"since": {
"description": "Inclusive lower bound. Default: last completed session, falling back to active-cycle start. Date-only values use the profile timezone.",
"anyOf": [
{
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
]
},
{
"type": "string",
"enum": [
"last_session",
"cycle_start"
]
}
]
},
"until": {
"description": "Exclusive upper bound; default is the server time captured on the first page.",
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
]
}
},
"additionalProperties": false
}
},
"required": [
"action_id",
"operation"
],
"additionalProperties": false
}
]
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"anyOf": [
{
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Due. May be unset on a web draft; a set date cannot be cleared."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"sort_order": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Drag order within an action group; not a progress status."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"overdue": {
"type": "boolean"
},
"done_since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"cycle_id",
"objective_id",
"title",
"description",
"due_at",
"status",
"sort_order",
"session_id",
"created_at",
"url",
"overdue",
"done_since_boundary"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"continuation": {
"anyOf": [
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"const": "action_read"
},
"arguments": {
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"due_before": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"outstanding": {
"description": "Only open or in_progress actions; exclude done across every page.",
"type": "boolean",
"const": true
},
"session_id": {
"description": "Filter actions created in this owned session; combine with cycle_id to select its cycle explicitly.",
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"overdue": {
"description": "Only non-done actions before due_before; requires an explicit local cutoff date for stable briefing pagination.",
"type": "boolean",
"const": true
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"cursor",
"limit",
"cycle_id",
"operation"
],
"additionalProperties": false
}
},
"required": [
"tool",
"arguments"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"items",
"next_cursor",
"continuation",
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "get"
},
"action": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Due. May be unset on a web draft; a set date cannot be cleared."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"sort_order": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Drag order within an action group; not a progress status."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"overdue": {
"type": "boolean"
},
"done_since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"cycle_id",
"objective_id",
"title",
"description",
"due_at",
"status",
"sort_order",
"session_id",
"created_at",
"url",
"overdue",
"done_since_boundary"
],
"additionalProperties": false
}
},
"required": [
"operation",
"action"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"action_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"comment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"action_id",
"status",
"comment",
"session_id",
"recorded_at"
],
"additionalProperties": false,
"description": "Action log stored in action_logs. Records a status observation and optional comment. Action detail shows Comments, a filtered view rather than the complete status history; status and timestamps are immutable, and only the comment may be cleared."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"continuation": {
"anyOf": [
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"const": "action_read"
},
"arguments": {
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"action_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "history"
},
"window": {
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
}
},
"required": [
"cursor",
"limit",
"action_id",
"operation",
"window"
],
"additionalProperties": false
}
},
"required": [
"tool",
"arguments"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"operation": {
"type": "string",
"const": "history"
},
"action_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"window": {
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
}
},
"required": [
"items",
"next_cursor",
"continuation",
"operation",
"action_id",
"window"
],
"additionalProperties": false
}
]
}
}
]Feature declaration: getAction
Requirement: docs/feature-specs/F5-actions.md · Access: retained-read
Tables: actions (read), cycles (read), objectives (read), sessions (read), action_logs (read)
Trusted context: authenticated actor
Retry: Safe to retry with the same resolved filters and cursor.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "actions.get",
"service": "actions.get",
"binding": "bound"
}
][
{
"tool": "action_read",
"collection": "actions",
"specification": "docs/feature-specs/F5-actions.md#mcp-source-mapping--selected-target",
"operation": "get",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"actions.get"
],
"gap": null,
"projection": "Project record.action and changed on writes; list uses resolved cycle_id and original filters; history preserves its resolved window."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"id"
],
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"action": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Due. May be unset on a web draft; a set date cannot be cleared."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"sort_order": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Drag order within an action group; not a progress status."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"overdue": {
"type": "boolean"
},
"done_since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"cycle_id",
"objective_id",
"title",
"description",
"due_at",
"status",
"sort_order",
"session_id",
"created_at",
"url",
"overdue",
"done_since_boundary"
],
"additionalProperties": false
},
"cycle": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
},
"objective": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Deadline; null when no deadline has been set."
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Progress. Derived from measurable results, independently of Status."
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Historical progress at the resolved last-session boundary; not current Progress."
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"cycle_id",
"title",
"description",
"deadline_at",
"status",
"created_at",
"short_code",
"url",
"progress_pct",
"boundary_progress_pct",
"movement_pp"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"source_session": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"vendor": {
"type": "string",
"enum": [
"claude",
"openai"
],
"description": "Conversation host: claude is shown as Claude; openai is shown as ChatGPT."
},
"source_url": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "External conversation link used by Open the conversation. Not the app detail URL."
},
"type": {
"anyOf": [
{
"type": "string",
"enum": [
"goal_setup",
"check_in",
"review",
"open_coaching"
],
"description": "Coaching session type: Goal setup, Check-in, Review or Open coaching. Separate from whether the session is still open."
},
{
"type": "null"
}
]
},
"briefing_notes": {
"type": "string",
"description": "UI document: Briefing. Server-prepared coaching context."
},
"headline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "One-line coaching-session summary used in session lists."
},
"summary_notes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI document: Summary. Saved when the coaching session closes."
},
"started_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"ended_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
],
"description": "Closed when set; In progress when null. This is derived session state, not a stored status enum."
},
"url": {
"type": "string",
"format": "uri",
"description": "Internal app link to coaching session details; distinct from source_url."
},
"duration_minutes": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"actions_created": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"actions_reviewed": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"id",
"vendor",
"source_url",
"type",
"briefing_notes",
"headline",
"summary_notes",
"started_at",
"ended_at",
"url",
"duration_minutes",
"actions_created",
"actions_reviewed"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"action_logs": {
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"action_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"comment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"action_id",
"status",
"comment",
"session_id",
"recorded_at"
],
"additionalProperties": false,
"description": "Action log stored in action_logs. Records a status observation and optional comment. Action detail shows Comments, a filtered view rather than the complete status history; status and timestamps are immutable, and only the comment may be cleared."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"action",
"cycle",
"objective",
"source_session",
"action_logs",
"continuations"
],
"additionalProperties": false
}[
{
"tool": "action_read",
"collection": "actions",
"specification": "docs/feature-specs/F5-actions.md#mcp-source-mapping--selected-target",
"operation": "get",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"actions.get"
],
"gap": null,
"projection": "Project record.action and changed on writes; list uses resolved cycle_id and original filters; history preserves its resolved window.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 100
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"due_before": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"outstanding": {
"description": "Only open or in_progress actions; exclude done across every page.",
"type": "boolean",
"const": true
},
"session_id": {
"description": "Filter actions created in this owned session; combine with cycle_id to select its cycle explicitly.",
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"overdue": {
"description": "Only non-done actions before due_before; requires an explicit local cutoff date for stable briefing pagination.",
"type": "boolean",
"const": true
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "get"
}
},
"required": [
"id",
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 100
},
"action_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "history"
},
"window": {
"type": "object",
"properties": {
"since": {
"description": "Inclusive lower bound. Default: last completed session, falling back to active-cycle start. Date-only values use the profile timezone.",
"anyOf": [
{
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
]
},
{
"type": "string",
"enum": [
"last_session",
"cycle_start"
]
}
]
},
"until": {
"description": "Exclusive upper bound; default is the server time captured on the first page.",
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
]
}
},
"additionalProperties": false
}
},
"required": [
"action_id",
"operation"
],
"additionalProperties": false
}
]
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"anyOf": [
{
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Due. May be unset on a web draft; a set date cannot be cleared."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"sort_order": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Drag order within an action group; not a progress status."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"overdue": {
"type": "boolean"
},
"done_since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"cycle_id",
"objective_id",
"title",
"description",
"due_at",
"status",
"sort_order",
"session_id",
"created_at",
"url",
"overdue",
"done_since_boundary"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"continuation": {
"anyOf": [
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"const": "action_read"
},
"arguments": {
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"due_before": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"outstanding": {
"description": "Only open or in_progress actions; exclude done across every page.",
"type": "boolean",
"const": true
},
"session_id": {
"description": "Filter actions created in this owned session; combine with cycle_id to select its cycle explicitly.",
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"overdue": {
"description": "Only non-done actions before due_before; requires an explicit local cutoff date for stable briefing pagination.",
"type": "boolean",
"const": true
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"cursor",
"limit",
"cycle_id",
"operation"
],
"additionalProperties": false
}
},
"required": [
"tool",
"arguments"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"items",
"next_cursor",
"continuation",
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "get"
},
"action": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Due. May be unset on a web draft; a set date cannot be cleared."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"sort_order": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Drag order within an action group; not a progress status."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"overdue": {
"type": "boolean"
},
"done_since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"cycle_id",
"objective_id",
"title",
"description",
"due_at",
"status",
"sort_order",
"session_id",
"created_at",
"url",
"overdue",
"done_since_boundary"
],
"additionalProperties": false
}
},
"required": [
"operation",
"action"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"action_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"comment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"action_id",
"status",
"comment",
"session_id",
"recorded_at"
],
"additionalProperties": false,
"description": "Action log stored in action_logs. Records a status observation and optional comment. Action detail shows Comments, a filtered view rather than the complete status history; status and timestamps are immutable, and only the comment may be cleared."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"continuation": {
"anyOf": [
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"const": "action_read"
},
"arguments": {
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"action_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "history"
},
"window": {
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
}
},
"required": [
"cursor",
"limit",
"action_id",
"operation",
"window"
],
"additionalProperties": false
}
},
"required": [
"tool",
"arguments"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"operation": {
"type": "string",
"const": "history"
},
"action_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"window": {
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
}
},
"required": [
"items",
"next_cursor",
"continuation",
"operation",
"action_id",
"window"
],
"additionalProperties": false
}
]
}
}
]Feature declaration: updateAction
Requirement: docs/feature-specs/F5-actions.md · Access: entitled-write
Tables: actions (write), cycles (read), objectives (read), sessions (read), action_logs (read)
Trusted context: authenticated actor
Retry: Inspect state after uncertain outcomes; never infer rollback from a response failure.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "actions.update",
"service": "actions.update",
"binding": "bound"
}
][
{
"tool": "action_write",
"collection": "actions",
"specification": "docs/feature-specs/F5-actions.md#mcp-source-mapping--selected-target",
"operation": "update",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"actions.update"
],
"gap": null,
"projection": "Project record.action and changed on writes; list uses resolved cycle_id and original filters; history preserves its resolved window."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"description": "New due date. Omit to preserve; a previously set date cannot be cleared. Web creation may initially have no date.",
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
}
},
"required": [
"id"
],
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"record": {
"type": "object",
"properties": {
"action": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Due. May be unset on a web draft; a set date cannot be cleared."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"sort_order": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Drag order within an action group; not a progress status."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"overdue": {
"type": "boolean"
},
"done_since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"cycle_id",
"objective_id",
"title",
"description",
"due_at",
"status",
"sort_order",
"session_id",
"created_at",
"url",
"overdue",
"done_since_boundary"
],
"additionalProperties": false
},
"cycle": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
},
"objective": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Deadline; null when no deadline has been set."
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Progress. Derived from measurable results, independently of Status."
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Historical progress at the resolved last-session boundary; not current Progress."
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"cycle_id",
"title",
"description",
"deadline_at",
"status",
"created_at",
"short_code",
"url",
"progress_pct",
"boundary_progress_pct",
"movement_pp"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"source_session": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"vendor": {
"type": "string",
"enum": [
"claude",
"openai"
],
"description": "Conversation host: claude is shown as Claude; openai is shown as ChatGPT."
},
"source_url": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "External conversation link used by Open the conversation. Not the app detail URL."
},
"type": {
"anyOf": [
{
"type": "string",
"enum": [
"goal_setup",
"check_in",
"review",
"open_coaching"
],
"description": "Coaching session type: Goal setup, Check-in, Review or Open coaching. Separate from whether the session is still open."
},
{
"type": "null"
}
]
},
"briefing_notes": {
"type": "string",
"description": "UI document: Briefing. Server-prepared coaching context."
},
"headline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "One-line coaching-session summary used in session lists."
},
"summary_notes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI document: Summary. Saved when the coaching session closes."
},
"started_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"ended_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
],
"description": "Closed when set; In progress when null. This is derived session state, not a stored status enum."
},
"url": {
"type": "string",
"format": "uri",
"description": "Internal app link to coaching session details; distinct from source_url."
},
"duration_minutes": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"actions_created": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"actions_reviewed": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"id",
"vendor",
"source_url",
"type",
"briefing_notes",
"headline",
"summary_notes",
"started_at",
"ended_at",
"url",
"duration_minutes",
"actions_created",
"actions_reviewed"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"action_logs": {
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"action_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"comment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"action_id",
"status",
"comment",
"session_id",
"recorded_at"
],
"additionalProperties": false,
"description": "Action log stored in action_logs. Records a status observation and optional comment. Action detail shows Comments, a filtered view rather than the complete status history; status and timestamps are immutable, and only the comment may be cleared."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"action",
"cycle",
"objective",
"source_session",
"action_logs",
"continuations"
],
"additionalProperties": false
},
"changed": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"entity": {
"type": "string",
"enum": [
"user",
"cycle",
"objective",
"result",
"result_log",
"action",
"action_log",
"session",
"note",
"habit_log"
]
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"entity",
"id"
],
"additionalProperties": false
}
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"record",
"changed",
"continuations"
],
"additionalProperties": false
}[
{
"tool": "action_write",
"collection": "actions",
"specification": "docs/feature-specs/F5-actions.md#mcp-source-mapping--selected-target",
"operation": "update",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"actions.update"
],
"gap": null,
"projection": "Project record.action and changed on writes; list uses resolved cycle_id and original filters; history preserves its resolved window.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"due_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"operation": {
"type": "string",
"const": "create"
}
},
"required": [
"title",
"due_at",
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string",
"minLength": 1
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"description": "New due date. Omit to preserve; a previously set date cannot be cleared.",
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"operation": {
"type": "string",
"const": "update"
}
},
"required": [
"id",
"operation"
],
"additionalProperties": false
}
]
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"action": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Due. May be unset on a web draft; a set date cannot be cleared."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"sort_order": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Drag order within an action group; not a progress status."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"overdue": {
"type": "boolean"
},
"done_since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"cycle_id",
"objective_id",
"title",
"description",
"due_at",
"status",
"sort_order",
"session_id",
"created_at",
"url",
"overdue",
"done_since_boundary"
],
"additionalProperties": false
},
"changed": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"entity": {
"type": "string",
"enum": [
"user",
"cycle",
"objective",
"result",
"result_log",
"action",
"action_log",
"session",
"note",
"habit_log"
]
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"entity",
"id"
],
"additionalProperties": false
}
}
},
"required": [
"action",
"changed"
],
"additionalProperties": false
}
}
]Feature declaration: reorderAction
Requirement: docs/feature-specs/F5-actions.md · Access: entitled-write
Tables: actions (write), cycles (read), objectives (read), sessions (read), action_logs (read)
Trusted context: authenticated actor
Retry: Inspect state after uncertain outcomes; never infer rollback from a response failure.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "actions.reorder",
"service": "actions.reorder",
"binding": "bound"
}
][]
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"sort_order": {
"type": "number"
}
},
"required": [
"id",
"sort_order"
],
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"record": {
"type": "object",
"properties": {
"action": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Due. May be unset on a web draft; a set date cannot be cleared."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"sort_order": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Drag order within an action group; not a progress status."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"overdue": {
"type": "boolean"
},
"done_since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"cycle_id",
"objective_id",
"title",
"description",
"due_at",
"status",
"sort_order",
"session_id",
"created_at",
"url",
"overdue",
"done_since_boundary"
],
"additionalProperties": false
},
"cycle": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
},
"objective": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Deadline; null when no deadline has been set."
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Progress. Derived from measurable results, independently of Status."
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Historical progress at the resolved last-session boundary; not current Progress."
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"cycle_id",
"title",
"description",
"deadline_at",
"status",
"created_at",
"short_code",
"url",
"progress_pct",
"boundary_progress_pct",
"movement_pp"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"source_session": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"vendor": {
"type": "string",
"enum": [
"claude",
"openai"
],
"description": "Conversation host: claude is shown as Claude; openai is shown as ChatGPT."
},
"source_url": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "External conversation link used by Open the conversation. Not the app detail URL."
},
"type": {
"anyOf": [
{
"type": "string",
"enum": [
"goal_setup",
"check_in",
"review",
"open_coaching"
],
"description": "Coaching session type: Goal setup, Check-in, Review or Open coaching. Separate from whether the session is still open."
},
{
"type": "null"
}
]
},
"briefing_notes": {
"type": "string",
"description": "UI document: Briefing. Server-prepared coaching context."
},
"headline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "One-line coaching-session summary used in session lists."
},
"summary_notes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI document: Summary. Saved when the coaching session closes."
},
"started_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"ended_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
],
"description": "Closed when set; In progress when null. This is derived session state, not a stored status enum."
},
"url": {
"type": "string",
"format": "uri",
"description": "Internal app link to coaching session details; distinct from source_url."
},
"duration_minutes": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"actions_created": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"actions_reviewed": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"id",
"vendor",
"source_url",
"type",
"briefing_notes",
"headline",
"summary_notes",
"started_at",
"ended_at",
"url",
"duration_minutes",
"actions_created",
"actions_reviewed"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"action_logs": {
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"action_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"comment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"action_id",
"status",
"comment",
"session_id",
"recorded_at"
],
"additionalProperties": false,
"description": "Action log stored in action_logs. Records a status observation and optional comment. Action detail shows Comments, a filtered view rather than the complete status history; status and timestamps are immutable, and only the comment may be cleared."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"action",
"cycle",
"objective",
"source_session",
"action_logs",
"continuations"
],
"additionalProperties": false
},
"changed": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"entity": {
"type": "string",
"enum": [
"user",
"cycle",
"objective",
"result",
"result_log",
"action",
"action_log",
"session",
"note",
"habit_log"
]
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"entity",
"id"
],
"additionalProperties": false
}
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"record",
"changed",
"continuations"
],
"additionalProperties": false
}[]
Feature declaration: deleteAction
Requirement: docs/feature-specs/F5-actions.md · Access: entitled-write
Tables: actions (delete)
Trusted context: authenticated actor
Retry: Inspect state after uncertain outcomes; never infer rollback from a response failure.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "actions.delete",
"service": "actions.delete",
"binding": "bound"
}
][
{
"tool": "action_delete",
"collection": "actions",
"specification": "docs/feature-specs/F5-actions.md#mcp-source-mapping--selected-target",
"operation": "commit",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"actions.delete"
],
"gap": null,
"projection": "Project record.action and changed on writes; list uses resolved cycle_id and original filters; history preserves its resolved window."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"preview_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Server impact preview ID; trusted application approval must already exist."
}
},
"required": [
"id",
"preview_id"
],
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"id"
],
"additionalProperties": false
}[
{
"tool": "action_delete",
"collection": "actions",
"specification": "docs/feature-specs/F5-actions.md#mcp-source-mapping--selected-target",
"operation": "commit",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"actions.delete"
],
"gap": null,
"projection": "Project record.action and changed on writes; list uses resolved cycle_id and original filters; history preserves its resolved window.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "preview"
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Exact owned record UUID. Resolve ambiguous targets before requesting impact."
}
},
"required": [
"operation",
"id"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "commit"
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"preview_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Server preview ID for this target. Not consent: genuine approval must already be recorded by the trusted application."
}
},
"required": [
"operation",
"id",
"preview_id"
],
"additionalProperties": false
}
]
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "preview"
},
"preview_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"expires_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"target": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
}
},
"required": [
"id",
"title"
],
"additionalProperties": false
},
"deleted": {
"type": "object",
"properties": {
"actions": {
"type": "number",
"const": 1
},
"action_logs": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"actions",
"action_logs"
],
"additionalProperties": false
},
"approval": {
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "required"
},
"url": {
"type": "string",
"format": "uri"
}
},
"required": [
"status",
"url"
],
"additionalProperties": false
}
},
"required": [
"operation",
"preview_id",
"expires_at",
"target",
"deleted",
"approval"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "commit"
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"operation",
"id"
],
"additionalProperties": false
}
]
}
}
]Feature declaration: createActionLog
Requirement: docs/feature-specs/F5-actions.md · Access: entitled-write
Tables: action_logs (write), actions (write), cycles (read), objectives (read), sessions (read), idempotency_keys (write)
Trusted context: authenticated actor
Retry: API requires client-key replay; unkeyed MCP calls must inspect state after an uncertain outcome.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "action_logs.create",
"service": "action_logs.create",
"binding": "bound"
}
][
{
"tool": "progress_record",
"collection": "progress",
"specification": "docs/feature-specs/F4-results.md#mcp-source-mapping--selected-target",
"operation": "action",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"action_logs.create"
],
"gap": null,
"projection": "Dispatch result evidence, habit day/comment and action outcome to their existing shared operations; project the affected record and changed IDs."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"anyOf": [
{
"type": "object",
"properties": {
"action_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"comment": {
"type": "string",
"minLength": 1
},
"idempotency_key": {
"type": "string",
"minLength": 1,
"maxLength": 255
}
},
"required": [
"action_id",
"status",
"idempotency_key"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"action_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"comment": {
"type": "string",
"minLength": 1
}
},
"required": [
"action_id",
"status"
],
"additionalProperties": false
}
]
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"record": {
"type": "object",
"properties": {
"action": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Due. May be unset on a web draft; a set date cannot be cleared."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"sort_order": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Drag order within an action group; not a progress status."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"overdue": {
"type": "boolean"
},
"done_since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"cycle_id",
"objective_id",
"title",
"description",
"due_at",
"status",
"sort_order",
"session_id",
"created_at",
"url",
"overdue",
"done_since_boundary"
],
"additionalProperties": false
},
"cycle": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
},
"objective": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Deadline; null when no deadline has been set."
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Progress. Derived from measurable results, independently of Status."
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Historical progress at the resolved last-session boundary; not current Progress."
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"cycle_id",
"title",
"description",
"deadline_at",
"status",
"created_at",
"short_code",
"url",
"progress_pct",
"boundary_progress_pct",
"movement_pp"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"source_session": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"vendor": {
"type": "string",
"enum": [
"claude",
"openai"
],
"description": "Conversation host: claude is shown as Claude; openai is shown as ChatGPT."
},
"source_url": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "External conversation link used by Open the conversation. Not the app detail URL."
},
"type": {
"anyOf": [
{
"type": "string",
"enum": [
"goal_setup",
"check_in",
"review",
"open_coaching"
],
"description": "Coaching session type: Goal setup, Check-in, Review or Open coaching. Separate from whether the session is still open."
},
{
"type": "null"
}
]
},
"briefing_notes": {
"type": "string",
"description": "UI document: Briefing. Server-prepared coaching context."
},
"headline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "One-line coaching-session summary used in session lists."
},
"summary_notes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI document: Summary. Saved when the coaching session closes."
},
"started_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"ended_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
],
"description": "Closed when set; In progress when null. This is derived session state, not a stored status enum."
},
"url": {
"type": "string",
"format": "uri",
"description": "Internal app link to coaching session details; distinct from source_url."
},
"duration_minutes": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"actions_created": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"actions_reviewed": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"id",
"vendor",
"source_url",
"type",
"briefing_notes",
"headline",
"summary_notes",
"started_at",
"ended_at",
"url",
"duration_minutes",
"actions_created",
"actions_reviewed"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"action_logs": {
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"action_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"comment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"action_id",
"status",
"comment",
"session_id",
"recorded_at"
],
"additionalProperties": false,
"description": "Action log stored in action_logs. Records a status observation and optional comment. Action detail shows Comments, a filtered view rather than the complete status history; status and timestamps are immutable, and only the comment may be cleared."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"action",
"cycle",
"objective",
"source_session",
"action_logs",
"continuations"
],
"additionalProperties": false
},
"changed": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"entity": {
"type": "string",
"enum": [
"user",
"cycle",
"objective",
"result",
"result_log",
"action",
"action_log",
"session",
"note",
"habit_log"
]
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"entity",
"id"
],
"additionalProperties": false
}
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"record",
"changed",
"continuations"
],
"additionalProperties": false
}[
{
"tool": "progress_record",
"collection": "progress",
"specification": "docs/feature-specs/F4-results.md#mcp-source-mapping--selected-target",
"operation": "action",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"action_logs.create"
],
"gap": null,
"projection": "Dispatch result evidence, habit day/comment and action outcome to their existing shared operations; project the affected record and changed IDs.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"anyOf": [
{
"anyOf": [
{
"type": "object",
"properties": {
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"value": {
"type": "number"
},
"comment": {
"type": "string",
"minLength": 1
},
"target": {
"type": "string",
"const": "result"
}
},
"required": [
"result_id",
"target"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"comment": {
"type": "string",
"minLength": 1
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"day": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"marked": {
"type": "boolean",
"description": "Desired calendar state: true marks the day; false unmarks it. Not an append-only history event."
},
"target": {
"type": "string",
"const": "result"
}
},
"required": [
"result_id",
"day",
"marked",
"target"
],
"additionalProperties": false
}
]
},
{
"type": "object",
"properties": {
"action_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"comment": {
"type": "string",
"minLength": 1
},
"target": {
"type": "string",
"const": "action"
}
},
"required": [
"action_id",
"status",
"target"
],
"additionalProperties": false
}
]
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"anyOf": [
{
"type": "object",
"properties": {
"result": {
"oneOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"boundary_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 1
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"boundary_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Start. Metric baseline; habit baselines are derived rather than stored."
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
}
]
},
"changed": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"entity": {
"type": "string",
"enum": [
"user",
"cycle",
"objective",
"result",
"result_log",
"action",
"action_log",
"session",
"note",
"habit_log"
]
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"entity",
"id"
],
"additionalProperties": false
}
}
},
"required": [
"result",
"changed"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"action": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Due. May be unset on a web draft; a set date cannot be cleared."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"sort_order": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Drag order within an action group; not a progress status."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"overdue": {
"type": "boolean"
},
"done_since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"cycle_id",
"objective_id",
"title",
"description",
"due_at",
"status",
"sort_order",
"session_id",
"created_at",
"url",
"overdue",
"done_since_boundary"
],
"additionalProperties": false
},
"changed": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"entity": {
"type": "string",
"enum": [
"user",
"cycle",
"objective",
"result",
"result_log",
"action",
"action_log",
"session",
"note",
"habit_log"
]
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"entity",
"id"
],
"additionalProperties": false
}
}
},
"required": [
"action",
"changed"
],
"additionalProperties": false
}
]
}
}
]Feature declaration: listActionLogs
Requirement: docs/feature-specs/F5-actions.md · Access: retained-read
Tables: action_logs (read)
Trusted context: authenticated actor
Retry: Safe to retry with the same resolved filters and cursor.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "action_logs.list",
"service": "action_logs.list",
"binding": "bound"
}
][]
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 100
},
"action_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"action_id"
],
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"action_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"comment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"action_id",
"status",
"comment",
"session_id",
"recorded_at"
],
"additionalProperties": false,
"description": "Action log stored in action_logs. Records a status observation and optional comment. Action detail shows Comments, a filtered view rather than the complete status history; status and timestamps are immutable, and only the comment may be cleared."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
}[]
Feature declaration: clearActionLogComment
Requirement: docs/feature-specs/F5-actions.md · Access: entitled-write
Tables: action_logs (write), actions (read), cycles (read), objectives (read), sessions (read)
Trusted context: authenticated actor
Retry: Inspect state after uncertain outcomes; never infer rollback from a response failure.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "action_logs.clear_comment",
"service": "action_logs.clear_comment",
"binding": "bound"
}
][]
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"id"
],
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"record": {
"type": "object",
"properties": {
"action": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Due. May be unset on a web draft; a set date cannot be cleared."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"sort_order": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Drag order within an action group; not a progress status."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"overdue": {
"type": "boolean"
},
"done_since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"cycle_id",
"objective_id",
"title",
"description",
"due_at",
"status",
"sort_order",
"session_id",
"created_at",
"url",
"overdue",
"done_since_boundary"
],
"additionalProperties": false
},
"cycle": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
},
"objective": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Deadline; null when no deadline has been set."
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Progress. Derived from measurable results, independently of Status."
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Historical progress at the resolved last-session boundary; not current Progress."
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"cycle_id",
"title",
"description",
"deadline_at",
"status",
"created_at",
"short_code",
"url",
"progress_pct",
"boundary_progress_pct",
"movement_pp"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"source_session": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"vendor": {
"type": "string",
"enum": [
"claude",
"openai"
],
"description": "Conversation host: claude is shown as Claude; openai is shown as ChatGPT."
},
"source_url": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "External conversation link used by Open the conversation. Not the app detail URL."
},
"type": {
"anyOf": [
{
"type": "string",
"enum": [
"goal_setup",
"check_in",
"review",
"open_coaching"
],
"description": "Coaching session type: Goal setup, Check-in, Review or Open coaching. Separate from whether the session is still open."
},
{
"type": "null"
}
]
},
"briefing_notes": {
"type": "string",
"description": "UI document: Briefing. Server-prepared coaching context."
},
"headline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "One-line coaching-session summary used in session lists."
},
"summary_notes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI document: Summary. Saved when the coaching session closes."
},
"started_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"ended_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
],
"description": "Closed when set; In progress when null. This is derived session state, not a stored status enum."
},
"url": {
"type": "string",
"format": "uri",
"description": "Internal app link to coaching session details; distinct from source_url."
},
"duration_minutes": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"actions_created": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"actions_reviewed": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"id",
"vendor",
"source_url",
"type",
"briefing_notes",
"headline",
"summary_notes",
"started_at",
"ended_at",
"url",
"duration_minutes",
"actions_created",
"actions_reviewed"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"action_logs": {
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"action_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"comment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"action_id",
"status",
"comment",
"session_id",
"recorded_at"
],
"additionalProperties": false,
"description": "Action log stored in action_logs. Records a status observation and optional comment. Action detail shows Comments, a filtered view rather than the complete status history; status and timestamps are immutable, and only the comment may be cleared."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"action",
"cycle",
"objective",
"source_session",
"action_logs",
"continuations"
],
"additionalProperties": false
},
"changed": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"entity": {
"type": "string",
"enum": [
"user",
"cycle",
"objective",
"result",
"result_log",
"action",
"action_log",
"session",
"note",
"habit_log"
]
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"entity",
"id"
],
"additionalProperties": false
}
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"record",
"changed",
"continuations"
],
"additionalProperties": false
}[]
Feature declaration: previewNoteDeletion
Requirement: docs/feature-specs/F6-notes.md · Access: entitled-write
Tables: notes (read)
Trusted context: authenticated actor
Retry: Preview does not authorize deletion. Commit rechecks actor, target, impact, expiry and application approval; incomplete impact fails closed.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "notes.preview_deletion",
"service": "notes.preview_deletion",
"binding": "bound"
}
][
{
"tool": "note_delete",
"collection": "notes",
"specification": "docs/feature-specs/F6-notes.md#mcp-source-mapping--selected-target",
"operation": "preview",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"notes.preview_deletion"
],
"gap": null,
"projection": "Project record and changed on writes; list preserves its resolved window; get returns note only."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"id"
],
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "preview"
},
"preview_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"expires_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"target": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"text": {
"type": "string",
"minLength": 1
}
},
"required": [
"id",
"text"
],
"additionalProperties": false
},
"deleted": {
"type": "object",
"properties": {
"notes": {
"type": "number",
"const": 1
}
},
"required": [
"notes"
],
"additionalProperties": false
},
"approval": {
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "required"
},
"url": {
"type": "string",
"format": "uri"
}
},
"required": [
"status",
"url"
],
"additionalProperties": false
}
},
"required": [
"operation",
"preview_id",
"expires_at",
"target",
"deleted",
"approval"
],
"additionalProperties": false
}[
{
"tool": "note_delete",
"collection": "notes",
"specification": "docs/feature-specs/F6-notes.md#mcp-source-mapping--selected-target",
"operation": "preview",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"notes.preview_deletion"
],
"gap": null,
"projection": "Project record and changed on writes; list preserves its resolved window; get returns note only.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "preview"
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Exact owned record UUID. Resolve ambiguous targets before requesting impact."
}
},
"required": [
"operation",
"id"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "commit"
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"preview_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Server preview ID for this target. Not consent: genuine approval must already be recorded by the trusted application."
}
},
"required": [
"operation",
"id",
"preview_id"
],
"additionalProperties": false
}
]
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "preview"
},
"preview_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"expires_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"target": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"text": {
"type": "string",
"minLength": 1
}
},
"required": [
"id",
"text"
],
"additionalProperties": false
},
"deleted": {
"type": "object",
"properties": {
"notes": {
"type": "number",
"const": 1
}
},
"required": [
"notes"
],
"additionalProperties": false
},
"approval": {
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "required"
},
"url": {
"type": "string",
"format": "uri"
}
},
"required": [
"status",
"url"
],
"additionalProperties": false
}
},
"required": [
"operation",
"preview_id",
"expires_at",
"target",
"deleted",
"approval"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "commit"
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"operation",
"id"
],
"additionalProperties": false
}
]
}
}
]Requirement: docs/feature-specs/F6-notes.md · Access: entitled-write
Tables: notes (write), idempotency_keys (write)
Trusted context: authenticated actor
Retry: API requires client-key replay; unkeyed MCP calls must inspect state after an uncertain outcome.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "notes.create",
"service": "notes.create",
"binding": "bound"
}
][
{
"tool": "note_write",
"collection": "notes",
"specification": "docs/feature-specs/F6-notes.md#mcp-source-mapping--selected-target",
"operation": "create",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"notes.create"
],
"gap": null,
"projection": "Project record and changed on writes; list preserves its resolved window; get returns note only."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"anyOf": [
{
"type": "object",
"properties": {
"text": {
"type": "string",
"minLength": 1
},
"idempotency_key": {
"type": "string",
"minLength": 1,
"maxLength": 255
}
},
"required": [
"text",
"idempotency_key"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"text": {
"type": "string",
"minLength": 1
}
},
"required": [
"text"
],
"additionalProperties": false
}
]
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"record": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"text": {
"type": "string",
"minLength": 1
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"text",
"recorded_at",
"url",
"since_boundary"
],
"additionalProperties": false
},
"changed": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"entity": {
"type": "string",
"enum": [
"user",
"cycle",
"objective",
"result",
"result_log",
"action",
"action_log",
"session",
"note",
"habit_log"
]
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"entity",
"id"
],
"additionalProperties": false
}
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"record",
"changed",
"continuations"
],
"additionalProperties": false
}[
{
"tool": "note_write",
"collection": "notes",
"specification": "docs/feature-specs/F6-notes.md#mcp-source-mapping--selected-target",
"operation": "create",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"notes.create"
],
"gap": null,
"projection": "Project record and changed on writes; list preserves its resolved window; get returns note only.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"text": {
"type": "string",
"minLength": 1
},
"operation": {
"type": "string",
"const": "create"
}
},
"required": [
"text",
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"text": {
"type": "string",
"minLength": 1
},
"operation": {
"type": "string",
"const": "update"
}
},
"required": [
"id",
"text",
"operation"
],
"additionalProperties": false
}
]
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"note": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"text": {
"type": "string",
"minLength": 1
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"text",
"recorded_at",
"url",
"since_boundary"
],
"additionalProperties": false
},
"changed": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"entity": {
"type": "string",
"enum": [
"user",
"cycle",
"objective",
"result",
"result_log",
"action",
"action_log",
"session",
"note",
"habit_log"
]
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"entity",
"id"
],
"additionalProperties": false
}
}
},
"required": [
"note",
"changed"
],
"additionalProperties": false
}
}
]Feature declaration: updateNote
Requirement: docs/feature-specs/F6-notes.md · Access: entitled-write
Tables: notes (write)
Trusted context: authenticated actor
Retry: Inspect state after uncertain outcomes; never infer rollback from a response failure.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "notes.update",
"service": "notes.update",
"binding": "bound"
}
][
{
"tool": "note_write",
"collection": "notes",
"specification": "docs/feature-specs/F6-notes.md#mcp-source-mapping--selected-target",
"operation": "update",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"notes.update"
],
"gap": null,
"projection": "Project record and changed on writes; list preserves its resolved window; get returns note only."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"text": {
"type": "string",
"minLength": 1
}
},
"required": [
"id",
"text"
],
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"record": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"text": {
"type": "string",
"minLength": 1
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"text",
"recorded_at",
"url",
"since_boundary"
],
"additionalProperties": false
},
"changed": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"entity": {
"type": "string",
"enum": [
"user",
"cycle",
"objective",
"result",
"result_log",
"action",
"action_log",
"session",
"note",
"habit_log"
]
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"entity",
"id"
],
"additionalProperties": false
}
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"record",
"changed",
"continuations"
],
"additionalProperties": false
}[
{
"tool": "note_write",
"collection": "notes",
"specification": "docs/feature-specs/F6-notes.md#mcp-source-mapping--selected-target",
"operation": "update",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"notes.update"
],
"gap": null,
"projection": "Project record and changed on writes; list preserves its resolved window; get returns note only.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"text": {
"type": "string",
"minLength": 1
},
"operation": {
"type": "string",
"const": "create"
}
},
"required": [
"text",
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"text": {
"type": "string",
"minLength": 1
},
"operation": {
"type": "string",
"const": "update"
}
},
"required": [
"id",
"text",
"operation"
],
"additionalProperties": false
}
]
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"note": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"text": {
"type": "string",
"minLength": 1
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"text",
"recorded_at",
"url",
"since_boundary"
],
"additionalProperties": false
},
"changed": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"entity": {
"type": "string",
"enum": [
"user",
"cycle",
"objective",
"result",
"result_log",
"action",
"action_log",
"session",
"note",
"habit_log"
]
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"entity",
"id"
],
"additionalProperties": false
}
}
},
"required": [
"note",
"changed"
],
"additionalProperties": false
}
}
]Feature declaration: listNotes
Requirement: docs/feature-specs/F6-notes.md · Access: retained-read
Tables: notes (read)
Trusted context: authenticated actor
Retry: Safe to retry with the same resolved filters and cursor.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "notes.list",
"service": "notes.list",
"binding": "bound"
}
][
{
"tool": "note_read",
"collection": "notes",
"specification": "docs/feature-specs/F6-notes.md#mcp-source-mapping--selected-target",
"operation": "list",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"notes.list"
],
"gap": null,
"projection": "Project record and changed on writes; list preserves its resolved window; get returns note only."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 100
},
"window": {
"type": "object",
"properties": {
"since": {
"description": "Inclusive lower bound. Default: last completed session, falling back to active-cycle start. Date-only values use the profile timezone.",
"anyOf": [
{
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
]
},
{
"type": "string",
"enum": [
"last_session",
"cycle_start"
]
}
]
},
"until": {
"description": "Exclusive upper bound; default is the server time captured on the first page.",
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"text": {
"type": "string",
"minLength": 1
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"text",
"recorded_at",
"url",
"since_boundary"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"window": {
"anyOf": [
{
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor",
"window"
],
"additionalProperties": false
}[
{
"tool": "note_read",
"collection": "notes",
"specification": "docs/feature-specs/F6-notes.md#mcp-source-mapping--selected-target",
"operation": "list",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"notes.list"
],
"gap": null,
"projection": "Project record and changed on writes; list preserves its resolved window; get returns note only.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 100
},
"window": {
"type": "object",
"properties": {
"since": {
"description": "Inclusive lower bound. Default: last completed session, falling back to active-cycle start. Date-only values use the profile timezone.",
"anyOf": [
{
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
]
},
{
"type": "string",
"enum": [
"last_session",
"cycle_start"
]
}
]
},
"until": {
"description": "Exclusive upper bound; default is the server time captured on the first page.",
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
]
}
},
"additionalProperties": false
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "get"
}
},
"required": [
"id",
"operation"
],
"additionalProperties": false
}
]
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"anyOf": [
{
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"text": {
"type": "string",
"minLength": 1
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"text",
"recorded_at",
"url",
"since_boundary"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"continuation": {
"anyOf": [
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"const": "note_read"
},
"arguments": {
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"window": {
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"cursor",
"limit",
"operation"
],
"additionalProperties": false
}
},
"required": [
"tool",
"arguments"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"operation": {
"type": "string",
"const": "list"
},
"window": {
"anyOf": [
{
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor",
"continuation",
"operation",
"window"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "get"
},
"note": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"text": {
"type": "string",
"minLength": 1
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"text",
"recorded_at",
"url",
"since_boundary"
],
"additionalProperties": false
}
},
"required": [
"operation",
"note"
],
"additionalProperties": false
}
]
}
}
]Requirement: docs/feature-specs/F6-notes.md · Access: retained-read
Tables: notes (read)
Trusted context: authenticated actor
Retry: Safe to retry with the same resolved filters and cursor.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "notes.get",
"service": "notes.get",
"binding": "bound"
}
][
{
"tool": "note_read",
"collection": "notes",
"specification": "docs/feature-specs/F6-notes.md#mcp-source-mapping--selected-target",
"operation": "get",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"notes.get"
],
"gap": null,
"projection": "Project record and changed on writes; list preserves its resolved window; get returns note only."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"id"
],
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"text": {
"type": "string",
"minLength": 1
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"text",
"recorded_at",
"url",
"since_boundary"
],
"additionalProperties": false
}[
{
"tool": "note_read",
"collection": "notes",
"specification": "docs/feature-specs/F6-notes.md#mcp-source-mapping--selected-target",
"operation": "get",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"notes.get"
],
"gap": null,
"projection": "Project record and changed on writes; list preserves its resolved window; get returns note only.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 100
},
"window": {
"type": "object",
"properties": {
"since": {
"description": "Inclusive lower bound. Default: last completed session, falling back to active-cycle start. Date-only values use the profile timezone.",
"anyOf": [
{
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
]
},
{
"type": "string",
"enum": [
"last_session",
"cycle_start"
]
}
]
},
"until": {
"description": "Exclusive upper bound; default is the server time captured on the first page.",
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
]
}
},
"additionalProperties": false
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "get"
}
},
"required": [
"id",
"operation"
],
"additionalProperties": false
}
]
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"anyOf": [
{
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"text": {
"type": "string",
"minLength": 1
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"text",
"recorded_at",
"url",
"since_boundary"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"continuation": {
"anyOf": [
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"const": "note_read"
},
"arguments": {
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"window": {
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"cursor",
"limit",
"operation"
],
"additionalProperties": false
}
},
"required": [
"tool",
"arguments"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"operation": {
"type": "string",
"const": "list"
},
"window": {
"anyOf": [
{
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor",
"continuation",
"operation",
"window"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "get"
},
"note": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"text": {
"type": "string",
"minLength": 1
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"text",
"recorded_at",
"url",
"since_boundary"
],
"additionalProperties": false
}
},
"required": [
"operation",
"note"
],
"additionalProperties": false
}
]
}
}
]Feature declaration: deleteNote
Requirement: docs/feature-specs/F6-notes.md · Access: entitled-write
Tables: notes (delete)
Trusted context: authenticated actor
Retry: Inspect state after uncertain outcomes; never infer rollback from a response failure.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "notes.delete",
"service": "notes.delete",
"binding": "bound"
}
][
{
"tool": "note_delete",
"collection": "notes",
"specification": "docs/feature-specs/F6-notes.md#mcp-source-mapping--selected-target",
"operation": "commit",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"notes.delete"
],
"gap": null,
"projection": "Project record and changed on writes; list preserves its resolved window; get returns note only."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"preview_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Server impact preview ID; trusted application approval must already exist."
}
},
"required": [
"id",
"preview_id"
],
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"id"
],
"additionalProperties": false
}[
{
"tool": "note_delete",
"collection": "notes",
"specification": "docs/feature-specs/F6-notes.md#mcp-source-mapping--selected-target",
"operation": "commit",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"notes.delete"
],
"gap": null,
"projection": "Project record and changed on writes; list preserves its resolved window; get returns note only.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "preview"
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Exact owned record UUID. Resolve ambiguous targets before requesting impact."
}
},
"required": [
"operation",
"id"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "commit"
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"preview_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Server preview ID for this target. Not consent: genuine approval must already be recorded by the trusted application."
}
},
"required": [
"operation",
"id",
"preview_id"
],
"additionalProperties": false
}
]
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "preview"
},
"preview_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"expires_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"target": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"text": {
"type": "string",
"minLength": 1
}
},
"required": [
"id",
"text"
],
"additionalProperties": false
},
"deleted": {
"type": "object",
"properties": {
"notes": {
"type": "number",
"const": 1
}
},
"required": [
"notes"
],
"additionalProperties": false
},
"approval": {
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "required"
},
"url": {
"type": "string",
"format": "uri"
}
},
"required": [
"status",
"url"
],
"additionalProperties": false
}
},
"required": [
"operation",
"preview_id",
"expires_at",
"target",
"deleted",
"approval"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "commit"
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"operation",
"id"
],
"additionalProperties": false
}
]
}
}
]Feature declaration: readStoredSession
Requirement: docs/feature-specs/F7-sessions.md · Access: retained-read
Tables: sessions (read)
Trusted context: authenticated actor
Retry: Safe to retry with the same resolved filters and cursor.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[]
[
{
"tool": "session_read",
"collection": "sessions",
"specification": "docs/feature-specs/F7-sessions.md#mcp-source-mapping--selected-target",
"operation": "get",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"sessions.get_stored"
],
"gap": null,
"projection": "List omits documents and preserves resolved window/boundary; stored get preserves nullable session; start explicitly constructs the compact MCP briefing and supported-reader continuations; close preserves saved outcome."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "string",
"const": "last_completed"
}
],
"description": "Exact session UUID, or last_completed for the most recently ended session; returns null when none exists."
}
},
"required": [
"id"
],
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"session": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"vendor": {
"type": "string",
"enum": [
"claude",
"openai"
],
"description": "Conversation host: claude is shown as Claude; openai is shown as ChatGPT."
},
"source_url": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "External conversation link used by Open the conversation. Not the app detail URL."
},
"type": {
"anyOf": [
{
"type": "string",
"enum": [
"goal_setup",
"check_in",
"review",
"open_coaching"
],
"description": "Coaching session type: Goal setup, Check-in, Review or Open coaching. Separate from whether the session is still open."
},
{
"type": "null"
}
]
},
"briefing_notes": {
"type": "string",
"description": "UI document: Briefing. Server-prepared coaching context."
},
"headline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "One-line coaching-session summary used in session lists."
},
"summary_notes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI document: Summary. Saved when the coaching session closes."
},
"started_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"ended_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
],
"description": "Closed when set; In progress when null. This is derived session state, not a stored status enum."
},
"url": {
"type": "string",
"format": "uri",
"description": "Internal app link to coaching session details; distinct from source_url."
},
"duration_minutes": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"actions_created": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"actions_reviewed": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"id",
"vendor",
"source_url",
"type",
"briefing_notes",
"headline",
"summary_notes",
"started_at",
"ended_at",
"url",
"duration_minutes",
"actions_created",
"actions_reviewed"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"boundary": {
"type": "object",
"properties": {
"at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"source": {
"type": "string",
"enum": [
"session",
"cycle_start",
"none"
]
}
},
"required": [
"at",
"session_id",
"source"
],
"additionalProperties": false
}
},
"required": [
"session",
"boundary"
],
"additionalProperties": false
}[
{
"tool": "session_read",
"collection": "sessions",
"specification": "docs/feature-specs/F7-sessions.md#mcp-source-mapping--selected-target",
"operation": "get",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"sessions.get_stored"
],
"gap": null,
"projection": "List omits documents and preserves resolved window/boundary; stored get preserves nullable session; start explicitly constructs the compact MCP briefing and supported-reader continuations; close preserves saved outcome.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 100
},
"window": {
"type": "object",
"properties": {
"since": {
"description": "Inclusive lower bound. Default: last completed session, falling back to active-cycle start. Date-only values use the profile timezone.",
"anyOf": [
{
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
]
},
{
"type": "string",
"enum": [
"last_session",
"cycle_start"
]
}
]
},
"until": {
"description": "Exclusive upper bound; default is the server time captured on the first page.",
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
]
}
},
"additionalProperties": false
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "get"
},
"id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "string",
"const": "last_completed"
}
],
"description": "Exact session UUID, or last_completed for the most recently ended session; returns null when none exists."
}
},
"required": [
"operation",
"id"
],
"additionalProperties": false
}
]
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"anyOf": [
{
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"vendor": {
"type": "string",
"enum": [
"claude",
"openai"
],
"description": "Conversation host: claude is shown as Claude; openai is shown as ChatGPT."
},
"source_url": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "External conversation link used by Open the conversation. Not the app detail URL."
},
"type": {
"anyOf": [
{
"type": "string",
"enum": [
"goal_setup",
"check_in",
"review",
"open_coaching"
],
"description": "Coaching session type: Goal setup, Check-in, Review or Open coaching. Separate from whether the session is still open."
},
{
"type": "null"
}
]
},
"headline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "One-line coaching-session summary used in session lists."
},
"started_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"ended_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
],
"description": "Closed when set; In progress when null. This is derived session state, not a stored status enum."
},
"url": {
"type": "string",
"format": "uri",
"description": "Internal app link to coaching session details; distinct from source_url."
},
"duration_minutes": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"actions_created": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"actions_reviewed": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"id",
"vendor",
"source_url",
"type",
"headline",
"started_at",
"ended_at",
"url",
"duration_minutes",
"actions_created",
"actions_reviewed"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"continuation": {
"anyOf": [
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"const": "session_read"
},
"arguments": {
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"window": {
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"cursor",
"limit",
"operation"
],
"additionalProperties": false
}
},
"required": [
"tool",
"arguments"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"operation": {
"type": "string",
"const": "list"
},
"window": {
"anyOf": [
{
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"boundary": {
"type": "object",
"properties": {
"at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"source": {
"type": "string",
"enum": [
"session",
"cycle_start",
"none"
]
}
},
"required": [
"at",
"session_id",
"source"
],
"additionalProperties": false
}
},
"required": [
"items",
"next_cursor",
"continuation",
"operation",
"window",
"boundary"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "get"
},
"session": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"vendor": {
"type": "string",
"enum": [
"claude",
"openai"
],
"description": "Conversation host: claude is shown as Claude; openai is shown as ChatGPT."
},
"source_url": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "External conversation link used by Open the conversation. Not the app detail URL."
},
"type": {
"anyOf": [
{
"type": "string",
"enum": [
"goal_setup",
"check_in",
"review",
"open_coaching"
],
"description": "Coaching session type: Goal setup, Check-in, Review or Open coaching. Separate from whether the session is still open."
},
{
"type": "null"
}
]
},
"briefing_notes": {
"type": "string",
"description": "UI document: Briefing. Server-prepared coaching context."
},
"headline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "One-line coaching-session summary used in session lists."
},
"summary_notes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI document: Summary. Saved when the coaching session closes."
},
"started_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"ended_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
],
"description": "Closed when set; In progress when null. This is derived session state, not a stored status enum."
},
"url": {
"type": "string",
"format": "uri",
"description": "Internal app link to coaching session details; distinct from source_url."
},
"duration_minutes": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"actions_created": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"actions_reviewed": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"id",
"vendor",
"source_url",
"type",
"briefing_notes",
"headline",
"summary_notes",
"started_at",
"ended_at",
"url",
"duration_minutes",
"actions_created",
"actions_reviewed"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"boundary": {
"type": "object",
"properties": {
"at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"source": {
"type": "string",
"enum": [
"session",
"cycle_start",
"none"
]
}
},
"required": [
"at",
"session_id",
"source"
],
"additionalProperties": false
}
},
"required": [
"operation",
"session",
"boundary"
],
"additionalProperties": false
}
]
}
}
]Feature declaration: loadBriefing
Requirement: docs/feature-specs/F7-sessions.md · Access: session-start
Tables: sessions (write), user (read), cycles (read), objectives (read), results (read), actions (read), notes (read)
Trusted context: session-origin
Retry: Inspect state after uncertain outcomes; never infer rollback from a response failure.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "sessions.start",
"service": "sessions.start",
"binding": "bound"
}
][
{
"tool": "session_start",
"collection": "sessions",
"specification": "docs/feature-specs/F7-sessions.md#mcp-source-mapping--selected-target",
"operation": "call",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"sessions.start"
],
"gap": null,
"projection": "List omits documents and preserves resolved window/boundary; stored get preserves nullable session; start explicitly constructs the compact MCP briefing and supported-reader continuations; close preserves saved outcome."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"force_new": {
"type": "boolean"
}
},
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"access_state": {
"type": "string",
"const": "active"
},
"session": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"started_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"stale": {
"type": "boolean"
}
},
"required": [
"id",
"started_at"
],
"additionalProperties": false
},
"briefing_notes": {
"type": "string"
},
"briefing": {
"type": "object",
"properties": {
"as_of": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"current": {
"type": "object",
"properties": {
"profile": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"name": {
"type": "string",
"description": "Chosen coaching/display name, used verbatim. Target UI prompt: What should we call you? Empty means unknown; no separate surname."
},
"about_me": {
"type": "string",
"description": "UI label: About me."
},
"timezone": {
"type": "string",
"minLength": 1,
"description": "UI label: Time zone. IANA zone used for calendar dates and boundaries."
}
},
"required": [
"id",
"name",
"about_me",
"timezone"
],
"additionalProperties": false
},
"boundary": {
"type": "object",
"properties": {
"at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"source": {
"type": "string",
"enum": [
"session",
"cycle_start",
"none"
]
}
},
"required": [
"at",
"session_id",
"source"
],
"additionalProperties": false
},
"cycle_line": {
"anyOf": [
{
"type": "object",
"properties": {
"range": {
"type": "string"
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100
}
},
"required": [
"range",
"time_gone_pct"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"cycles": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"cycle": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"objectives": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Deadline; null when no deadline has been set."
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Progress. Derived from measurable results, independently of Status."
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Historical progress at the resolved last-session boundary; not current Progress."
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"cycle_id",
"title",
"description",
"deadline_at",
"status",
"created_at",
"short_code",
"url",
"progress_pct",
"boundary_progress_pct",
"movement_pp"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"results": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"boundary_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 1
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"boundary_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Start. Metric baseline; habit baselines are derived rather than stored."
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
}
]
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"actions": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Due. May be unset on a web draft; a set date cannot be cleared."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"sort_order": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Drag order within an action group; not a progress status."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"overdue": {
"type": "boolean"
},
"done_since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"cycle_id",
"objective_id",
"title",
"description",
"due_at",
"status",
"sort_order",
"session_id",
"created_at",
"url",
"overdue",
"done_since_boundary"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"notes": {
"type": "object",
"properties": {
"notes": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"text": {
"type": "string",
"minLength": 1
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"text",
"recorded_at",
"url",
"since_boundary"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"selection": {
"type": "string",
"enum": [
"since_boundary",
"recent_fallback",
"selected",
"history"
]
},
"total": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"notes",
"selection",
"total"
],
"additionalProperties": false
},
"last_completed_session": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"vendor": {
"type": "string",
"enum": [
"claude",
"openai"
],
"description": "Conversation host: claude is shown as Claude; openai is shown as ChatGPT."
},
"source_url": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "External conversation link used by Open the conversation. Not the app detail URL."
},
"type": {
"anyOf": [
{
"type": "string",
"enum": [
"goal_setup",
"check_in",
"review",
"open_coaching"
],
"description": "Coaching session type: Goal setup, Check-in, Review or Open coaching. Separate from whether the session is still open."
},
{
"type": "null"
}
]
},
"briefing_notes": {
"type": "string",
"description": "UI document: Briefing. Server-prepared coaching context."
},
"headline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "One-line coaching-session summary used in session lists."
},
"summary_notes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI document: Summary. Saved when the coaching session closes."
},
"started_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"ended_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
],
"description": "Closed when set; In progress when null. This is derived session state, not a stored status enum."
},
"url": {
"type": "string",
"format": "uri",
"description": "Internal app link to coaching session details; distinct from source_url."
},
"duration_minutes": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"actions_created": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"actions_reviewed": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"id",
"vendor",
"source_url",
"type",
"briefing_notes",
"headline",
"summary_notes",
"started_at",
"ended_at",
"url",
"duration_minutes",
"actions_created",
"actions_reviewed"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"selected": {
"type": "object",
"properties": {
"objective": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Deadline; null when no deadline has been set."
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Progress. Derived from measurable results, independently of Status."
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Historical progress at the resolved last-session boundary; not current Progress."
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"cycle_id",
"title",
"description",
"deadline_at",
"status",
"created_at",
"short_code",
"url",
"progress_pct",
"boundary_progress_pct",
"movement_pp"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"result": {
"anyOf": [
{
"oneOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"boundary_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 1
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"boundary_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Start. Metric baseline; habit baselines are derived rather than stored."
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
}
]
},
{
"type": "null"
}
]
},
"action": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Due. May be unset on a web draft; a set date cannot be cleared."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"sort_order": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Drag order within an action group; not a progress status."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"overdue": {
"type": "boolean"
},
"done_since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"cycle_id",
"objective_id",
"title",
"description",
"due_at",
"status",
"sort_order",
"session_id",
"created_at",
"url",
"overdue",
"done_since_boundary"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"note": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"text": {
"type": "string",
"minLength": 1
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"text",
"recorded_at",
"url",
"since_boundary"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"session": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"vendor": {
"type": "string",
"enum": [
"claude",
"openai"
],
"description": "Conversation host: claude is shown as Claude; openai is shown as ChatGPT."
},
"source_url": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "External conversation link used by Open the conversation. Not the app detail URL."
},
"type": {
"anyOf": [
{
"type": "string",
"enum": [
"goal_setup",
"check_in",
"review",
"open_coaching"
],
"description": "Coaching session type: Goal setup, Check-in, Review or Open coaching. Separate from whether the session is still open."
},
{
"type": "null"
}
]
},
"briefing_notes": {
"type": "string",
"description": "UI document: Briefing. Server-prepared coaching context."
},
"headline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "One-line coaching-session summary used in session lists."
},
"summary_notes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI document: Summary. Saved when the coaching session closes."
},
"started_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"ended_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
],
"description": "Closed when set; In progress when null. This is derived session state, not a stored status enum."
},
"url": {
"type": "string",
"format": "uri",
"description": "Internal app link to coaching session details; distinct from source_url."
},
"duration_minutes": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"actions_created": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"actions_reviewed": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"id",
"vendor",
"source_url",
"type",
"briefing_notes",
"headline",
"summary_notes",
"started_at",
"ended_at",
"url",
"duration_minutes",
"actions_created",
"actions_reviewed"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}
},
"required": [
"objective",
"result",
"action",
"note",
"session"
],
"additionalProperties": false
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"profile",
"boundary",
"cycle_line",
"cycles",
"cycle",
"objectives",
"results",
"actions",
"notes",
"last_completed_session",
"selected",
"continuations"
],
"additionalProperties": false
},
"progress_by_type": {
"type": "object",
"properties": {
"objectives": {
"type": "object",
"properties": {
"on_track": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"off_track": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"completed": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"on_track",
"off_track",
"completed"
],
"additionalProperties": false
},
"results": {
"type": "object",
"properties": {
"in_play": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"in_progress": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"completed": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"average_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"in_play",
"in_progress",
"completed",
"average_progress_pct"
],
"additionalProperties": false
},
"actions": {
"type": "object",
"properties": {
"open": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"in_progress": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"done": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"overdue": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"open",
"in_progress",
"done",
"overdue"
],
"additionalProperties": false
},
"notes": {
"type": "object",
"properties": {
"total": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"since_boundary": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"total",
"since_boundary"
],
"additionalProperties": false
}
},
"required": [
"objectives",
"results",
"actions",
"notes"
],
"additionalProperties": false
},
"session_history": {
"type": "object",
"properties": {
"items": {
"maxItems": 6,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"vendor": {
"type": "string",
"enum": [
"claude",
"openai"
],
"description": "Conversation host: claude is shown as Claude; openai is shown as ChatGPT."
},
"source_url": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "External conversation link used by Open the conversation. Not the app detail URL."
},
"type": {
"anyOf": [
{
"type": "string",
"enum": [
"goal_setup",
"check_in",
"review",
"open_coaching"
],
"description": "Coaching session type: Goal setup, Check-in, Review or Open coaching. Separate from whether the session is still open."
},
{
"type": "null"
}
]
},
"briefing_notes": {
"type": "string",
"description": "UI document: Briefing. Server-prepared coaching context."
},
"headline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "One-line coaching-session summary used in session lists."
},
"summary_notes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI document: Summary. Saved when the coaching session closes."
},
"started_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"ended_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
],
"description": "Closed when set; In progress when null. This is derived session state, not a stored status enum."
},
"url": {
"type": "string",
"format": "uri",
"description": "Internal app link to coaching session details; distinct from source_url."
},
"duration_minutes": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"actions_created": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"actions_reviewed": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"id",
"vendor",
"source_url",
"type",
"briefing_notes",
"headline",
"summary_notes",
"started_at",
"ended_at",
"url",
"duration_minutes",
"actions_created",
"actions_reviewed"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"attention": {
"type": "object",
"properties": {
"overdue_actions": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Due. May be unset on a web draft; a set date cannot be cleared."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"sort_order": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Drag order within an action group; not a progress status."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"overdue": {
"type": "boolean"
},
"done_since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"cycle_id",
"objective_id",
"title",
"description",
"due_at",
"status",
"sort_order",
"session_id",
"created_at",
"url",
"overdue",
"done_since_boundary"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"never_updated_results": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"boundary_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 1
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"boundary_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Start. Metric baseline; habit baselines are derived rather than stored."
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
}
]
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"silent_results": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"boundary_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 1
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"boundary_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Start. Metric baseline; habit baselines are derived rather than stored."
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
}
]
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"unmarked_habits": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"boundary_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 1
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"boundary_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Start. Metric baseline; habit baselines are derived rather than stored."
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
}
]
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
}
},
"required": [
"overdue_actions",
"never_updated_results",
"silent_results",
"unmarked_habits"
],
"additionalProperties": false
},
"pace": {
"type": "string",
"enum": [
"ahead",
"behind",
"level",
"nothing_measurable"
]
},
"next_due_action": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Due. May be unset on a web draft; a set date cannot be cleared."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"sort_order": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Drag order within an action group; not a progress status."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"overdue": {
"type": "boolean"
},
"done_since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"cycle_id",
"objective_id",
"title",
"description",
"due_at",
"status",
"sort_order",
"session_id",
"created_at",
"url",
"overdue",
"done_since_boundary"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}
},
"required": [
"as_of",
"current",
"progress_by_type",
"session_history",
"attention",
"pace",
"next_due_action"
],
"additionalProperties": false
}
},
"required": [
"access_state",
"session",
"briefing_notes",
"briefing"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"access_state": {
"type": "string",
"const": "unpaid"
},
"enablement": {
"type": "object",
"properties": {
"instruction": {
"type": "string"
},
"signup_url": {
"type": "string",
"format": "uri"
}
},
"required": [
"instruction",
"signup_url"
],
"additionalProperties": false
}
},
"required": [
"access_state",
"enablement"
],
"additionalProperties": false
}
]
}[
{
"tool": "session_start",
"collection": "sessions",
"specification": "docs/feature-specs/F7-sessions.md#mcp-source-mapping--selected-target",
"operation": "call",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"sessions.start"
],
"gap": null,
"projection": "List omits documents and preserves resolved window/boundary; stored get preserves nullable session; start explicitly constructs the compact MCP briefing and supported-reader continuations; close preserves saved outcome.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"force_new": {
"type": "boolean"
}
},
"additionalProperties": false
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"access_state": {
"type": "string",
"const": "active"
},
"session": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"started_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"stale": {
"type": "boolean"
}
},
"required": [
"id",
"started_at"
],
"additionalProperties": false
},
"briefing_notes": {
"type": "string"
},
"briefing": {
"type": "object",
"properties": {
"as_of": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"current": {
"type": "object",
"properties": {
"profile": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"name": {
"type": "string",
"description": "Chosen coaching/display name, used verbatim. Target UI prompt: What should we call you? Empty means unknown; no separate surname."
},
"about_me": {
"type": "string",
"description": "UI label: About me."
},
"timezone": {
"type": "string",
"minLength": 1,
"description": "UI label: Time zone. IANA zone used for calendar dates and boundaries."
}
},
"required": [
"id",
"name",
"about_me",
"timezone"
],
"additionalProperties": false
},
"boundary": {
"type": "object",
"properties": {
"at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"source": {
"type": "string",
"enum": [
"session",
"cycle_start",
"none"
]
}
},
"required": [
"at",
"session_id",
"source"
],
"additionalProperties": false
},
"cycle_line": {
"anyOf": [
{
"type": "object",
"properties": {
"range": {
"type": "string"
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100
}
},
"required": [
"range",
"time_gone_pct"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"cycles": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"continuation": {
"anyOf": [
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"const": "cycle_read"
},
"arguments": {
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"cursor",
"limit",
"operation"
],
"additionalProperties": false
}
},
"required": [
"tool",
"arguments"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor",
"continuation"
],
"additionalProperties": false
},
"cycle": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"objectives": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Deadline; null when no deadline has been set."
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Progress. Derived from measurable results, independently of Status."
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Historical progress at the resolved last-session boundary; not current Progress."
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"cycle_id",
"title",
"description",
"deadline_at",
"status",
"created_at",
"short_code",
"url",
"progress_pct",
"boundary_progress_pct",
"movement_pp"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"continuation": {
"anyOf": [
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"const": "objective_read"
},
"arguments": {
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"cursor",
"limit",
"cycle_id",
"operation"
],
"additionalProperties": false
}
},
"required": [
"tool",
"arguments"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor",
"continuation"
],
"additionalProperties": false
},
"results": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"boundary_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 1
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"boundary_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Start. Metric baseline; habit baselines are derived rather than stored."
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
}
]
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"continuation": {
"anyOf": [
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"const": "result_read"
},
"arguments": {
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"description": "List results across one cycle instead of a single objective. Supply exactly one parent selector.",
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"attention": {
"description": "Optional briefing subset: no evidence ever, no update in the window, or habit with no mark in the window.",
"type": "string",
"enum": [
"never_updated",
"silent",
"unmarked"
]
},
"window": {
"description": "Required for silent/unmarked attention. Use exact server-resolved briefing bounds; current result figures remain current.",
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"cursor",
"limit",
"operation"
],
"additionalProperties": false
}
},
"required": [
"tool",
"arguments"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor",
"continuation"
],
"additionalProperties": false
},
"actions": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Due. May be unset on a web draft; a set date cannot be cleared."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"sort_order": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Drag order within an action group; not a progress status."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"overdue": {
"type": "boolean"
},
"done_since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"cycle_id",
"objective_id",
"title",
"description",
"due_at",
"status",
"sort_order",
"session_id",
"created_at",
"url",
"overdue",
"done_since_boundary"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"continuation": {
"anyOf": [
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"const": "action_read"
},
"arguments": {
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"due_before": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"outstanding": {
"type": "boolean",
"const": true
},
"session_id": {
"description": "Filter actions created in this owned session; combine with cycle_id to select its cycle explicitly.",
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"overdue": {
"description": "Only non-done actions before due_before; requires an explicit local cutoff date for stable briefing pagination.",
"type": "boolean",
"const": true
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"cursor",
"limit",
"cycle_id",
"outstanding",
"operation"
],
"additionalProperties": false
}
},
"required": [
"tool",
"arguments"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor",
"continuation"
],
"additionalProperties": false
},
"notes": {
"type": "object",
"properties": {
"notes": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"text": {
"type": "string",
"minLength": 1
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"text",
"recorded_at",
"url",
"since_boundary"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"continuation": {
"anyOf": [
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"const": "note_read"
},
"arguments": {
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"window": {
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"cursor",
"limit",
"operation"
],
"additionalProperties": false
}
},
"required": [
"tool",
"arguments"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor",
"continuation"
],
"additionalProperties": false
},
"selection": {
"type": "string",
"enum": [
"since_boundary",
"recent_fallback",
"selected",
"history"
]
},
"total": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"notes",
"selection",
"total"
],
"additionalProperties": false
},
"last_completed_session": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"vendor": {
"type": "string",
"enum": [
"claude",
"openai"
],
"description": "Conversation host: claude is shown as Claude; openai is shown as ChatGPT."
},
"source_url": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "External conversation link used by Open the conversation. Not the app detail URL."
},
"type": {
"anyOf": [
{
"type": "string",
"enum": [
"goal_setup",
"check_in",
"review",
"open_coaching"
],
"description": "Coaching session type: Goal setup, Check-in, Review or Open coaching. Separate from whether the session is still open."
},
{
"type": "null"
}
]
},
"briefing_notes": {
"type": "string",
"description": "UI document: Briefing. Server-prepared coaching context."
},
"headline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "One-line coaching-session summary used in session lists."
},
"summary_notes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI document: Summary. Saved when the coaching session closes."
},
"started_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"ended_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
],
"description": "Closed when set; In progress when null. This is derived session state, not a stored status enum."
},
"url": {
"type": "string",
"format": "uri",
"description": "Internal app link to coaching session details; distinct from source_url."
},
"duration_minutes": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"actions_created": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"actions_reviewed": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"id",
"vendor",
"source_url",
"type",
"briefing_notes",
"headline",
"summary_notes",
"started_at",
"ended_at",
"url",
"duration_minutes",
"actions_created",
"actions_reviewed"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"selected": {
"type": "object",
"properties": {
"objective": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Deadline; null when no deadline has been set."
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Progress. Derived from measurable results, independently of Status."
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Historical progress at the resolved last-session boundary; not current Progress."
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"cycle_id",
"title",
"description",
"deadline_at",
"status",
"created_at",
"short_code",
"url",
"progress_pct",
"boundary_progress_pct",
"movement_pp"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"result": {
"anyOf": [
{
"oneOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"boundary_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 1
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"boundary_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Start. Metric baseline; habit baselines are derived rather than stored."
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
}
]
},
{
"type": "null"
}
]
},
"action": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Due. May be unset on a web draft; a set date cannot be cleared."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"sort_order": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Drag order within an action group; not a progress status."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"overdue": {
"type": "boolean"
},
"done_since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"cycle_id",
"objective_id",
"title",
"description",
"due_at",
"status",
"sort_order",
"session_id",
"created_at",
"url",
"overdue",
"done_since_boundary"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"note": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"text": {
"type": "string",
"minLength": 1
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"text",
"recorded_at",
"url",
"since_boundary"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"session": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"vendor": {
"type": "string",
"enum": [
"claude",
"openai"
],
"description": "Conversation host: claude is shown as Claude; openai is shown as ChatGPT."
},
"source_url": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "External conversation link used by Open the conversation. Not the app detail URL."
},
"type": {
"anyOf": [
{
"type": "string",
"enum": [
"goal_setup",
"check_in",
"review",
"open_coaching"
],
"description": "Coaching session type: Goal setup, Check-in, Review or Open coaching. Separate from whether the session is still open."
},
{
"type": "null"
}
]
},
"briefing_notes": {
"type": "string",
"description": "UI document: Briefing. Server-prepared coaching context."
},
"headline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "One-line coaching-session summary used in session lists."
},
"summary_notes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI document: Summary. Saved when the coaching session closes."
},
"started_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"ended_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
],
"description": "Closed when set; In progress when null. This is derived session state, not a stored status enum."
},
"url": {
"type": "string",
"format": "uri",
"description": "Internal app link to coaching session details; distinct from source_url."
},
"duration_minutes": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"actions_created": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"actions_reviewed": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"id",
"vendor",
"source_url",
"type",
"briefing_notes",
"headline",
"summary_notes",
"started_at",
"ended_at",
"url",
"duration_minutes",
"actions_created",
"actions_reviewed"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}
},
"required": [
"objective",
"result",
"action",
"note",
"session"
],
"additionalProperties": false
}
},
"required": [
"profile",
"boundary",
"cycle_line",
"cycles",
"cycle",
"objectives",
"results",
"actions",
"notes",
"last_completed_session",
"selected"
],
"additionalProperties": false
},
"progress_by_type": {
"type": "object",
"properties": {
"objectives": {
"type": "object",
"properties": {
"on_track": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"off_track": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"completed": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"on_track",
"off_track",
"completed"
],
"additionalProperties": false
},
"results": {
"type": "object",
"properties": {
"in_play": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"in_progress": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"completed": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"average_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"in_play",
"in_progress",
"completed",
"average_progress_pct"
],
"additionalProperties": false
},
"actions": {
"type": "object",
"properties": {
"open": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"in_progress": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"done": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"overdue": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"open",
"in_progress",
"done",
"overdue"
],
"additionalProperties": false
},
"notes": {
"type": "object",
"properties": {
"total": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"since_boundary": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"total",
"since_boundary"
],
"additionalProperties": false
}
},
"required": [
"objectives",
"results",
"actions",
"notes"
],
"additionalProperties": false
},
"session_history": {
"type": "object",
"properties": {
"items": {
"maxItems": 6,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"vendor": {
"type": "string",
"enum": [
"claude",
"openai"
],
"description": "Conversation host: claude is shown as Claude; openai is shown as ChatGPT."
},
"source_url": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "External conversation link used by Open the conversation. Not the app detail URL."
},
"type": {
"anyOf": [
{
"type": "string",
"enum": [
"goal_setup",
"check_in",
"review",
"open_coaching"
],
"description": "Coaching session type: Goal setup, Check-in, Review or Open coaching. Separate from whether the session is still open."
},
{
"type": "null"
}
]
},
"headline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "One-line coaching-session summary used in session lists."
},
"started_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"ended_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
],
"description": "Closed when set; In progress when null. This is derived session state, not a stored status enum."
},
"url": {
"type": "string",
"format": "uri",
"description": "Internal app link to coaching session details; distinct from source_url."
},
"duration_minutes": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"actions_created": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"actions_reviewed": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"id",
"vendor",
"source_url",
"type",
"headline",
"started_at",
"ended_at",
"url",
"duration_minutes",
"actions_created",
"actions_reviewed"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"continuation": {
"anyOf": [
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"const": "session_read"
},
"arguments": {
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"window": {
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"cursor",
"limit",
"operation"
],
"additionalProperties": false
}
},
"required": [
"tool",
"arguments"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor",
"continuation"
],
"additionalProperties": false
},
"attention": {
"type": "object",
"properties": {
"overdue_actions": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Due. May be unset on a web draft; a set date cannot be cleared."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"sort_order": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Drag order within an action group; not a progress status."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"overdue": {
"type": "boolean"
},
"done_since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"cycle_id",
"objective_id",
"title",
"description",
"due_at",
"status",
"sort_order",
"session_id",
"created_at",
"url",
"overdue",
"done_since_boundary"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"continuation": {
"anyOf": [
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"const": "action_read"
},
"arguments": {
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"due_before": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"outstanding": {
"description": "Only open or in_progress actions; exclude done across every page.",
"type": "boolean",
"const": true
},
"session_id": {
"description": "Filter actions created in this owned session; combine with cycle_id to select its cycle explicitly.",
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"overdue": {
"type": "boolean",
"const": true
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"cursor",
"limit",
"cycle_id",
"due_before",
"overdue",
"operation"
],
"additionalProperties": false
}
},
"required": [
"tool",
"arguments"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor",
"continuation"
],
"additionalProperties": false
},
"never_updated_results": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"boundary_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 1
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"boundary_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Start. Metric baseline; habit baselines are derived rather than stored."
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
}
]
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"continuation": {
"anyOf": [
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"const": "result_read"
},
"arguments": {
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"description": "List results across one cycle instead of a single objective. Supply exactly one parent selector.",
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"attention": {
"type": "string",
"const": "never_updated"
},
"window": {
"description": "Required for silent/unmarked attention. Use exact server-resolved briefing bounds; current result figures remain current.",
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"cursor",
"limit",
"attention",
"operation"
],
"additionalProperties": false
}
},
"required": [
"tool",
"arguments"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor",
"continuation"
],
"additionalProperties": false
},
"silent_results": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"boundary_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 1
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"boundary_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Start. Metric baseline; habit baselines are derived rather than stored."
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
}
]
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"continuation": {
"anyOf": [
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"const": "result_read"
},
"arguments": {
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"description": "List results across one cycle instead of a single objective. Supply exactly one parent selector.",
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"attention": {
"type": "string",
"const": "silent"
},
"window": {
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"cursor",
"limit",
"attention",
"window",
"operation"
],
"additionalProperties": false
}
},
"required": [
"tool",
"arguments"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor",
"continuation"
],
"additionalProperties": false
},
"unmarked_habits": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"boundary_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 1
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"boundary_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Start. Metric baseline; habit baselines are derived rather than stored."
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
}
]
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"continuation": {
"anyOf": [
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"const": "result_read"
},
"arguments": {
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"description": "List results across one cycle instead of a single objective. Supply exactly one parent selector.",
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"attention": {
"type": "string",
"const": "unmarked"
},
"window": {
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"cursor",
"limit",
"attention",
"window",
"operation"
],
"additionalProperties": false
}
},
"required": [
"tool",
"arguments"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor",
"continuation"
],
"additionalProperties": false
}
},
"required": [
"overdue_actions",
"never_updated_results",
"silent_results",
"unmarked_habits"
],
"additionalProperties": false
},
"pace": {
"type": "string",
"enum": [
"ahead",
"behind",
"level",
"nothing_measurable"
]
},
"next_due_action": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Due. May be unset on a web draft; a set date cannot be cleared."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"sort_order": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Drag order within an action group; not a progress status."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"overdue": {
"type": "boolean"
},
"done_since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"cycle_id",
"objective_id",
"title",
"description",
"due_at",
"status",
"sort_order",
"session_id",
"created_at",
"url",
"overdue",
"done_since_boundary"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}
},
"required": [
"as_of",
"current",
"progress_by_type",
"session_history",
"attention",
"pace",
"next_due_action"
],
"additionalProperties": false
}
},
"required": [
"access_state",
"session",
"briefing_notes",
"briefing"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"access_state": {
"type": "string",
"const": "unpaid"
},
"enablement": {
"type": "object",
"properties": {
"instruction": {
"type": "string"
},
"signup_url": {
"type": "string",
"format": "uri"
}
},
"required": [
"instruction",
"signup_url"
],
"additionalProperties": false
}
},
"required": [
"access_state",
"enablement"
],
"additionalProperties": false
}
]
}
}
]Feature declaration: listSessions
Requirement: docs/feature-specs/F7-sessions.md · Access: retained-read
Tables: sessions (read)
Trusted context: authenticated actor
Retry: Safe to retry with the same resolved filters and cursor.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "sessions.list",
"service": "sessions.list",
"binding": "bound"
}
][
{
"tool": "session_read",
"collection": "sessions",
"specification": "docs/feature-specs/F7-sessions.md#mcp-source-mapping--selected-target",
"operation": "list",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"sessions.list"
],
"gap": null,
"projection": "List omits documents and preserves resolved window/boundary; stored get preserves nullable session; start explicitly constructs the compact MCP briefing and supported-reader continuations; close preserves saved outcome."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 100
},
"window": {
"type": "object",
"properties": {
"since": {
"description": "Inclusive lower bound. Default: last completed session, falling back to active-cycle start. Date-only values use the profile timezone.",
"anyOf": [
{
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
]
},
{
"type": "string",
"enum": [
"last_session",
"cycle_start"
]
}
]
},
"until": {
"description": "Exclusive upper bound; default is the server time captured on the first page.",
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"vendor": {
"type": "string",
"enum": [
"claude",
"openai"
],
"description": "Conversation host: claude is shown as Claude; openai is shown as ChatGPT."
},
"source_url": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "External conversation link used by Open the conversation. Not the app detail URL."
},
"type": {
"anyOf": [
{
"type": "string",
"enum": [
"goal_setup",
"check_in",
"review",
"open_coaching"
],
"description": "Coaching session type: Goal setup, Check-in, Review or Open coaching. Separate from whether the session is still open."
},
{
"type": "null"
}
]
},
"briefing_notes": {
"type": "string",
"description": "UI document: Briefing. Server-prepared coaching context."
},
"headline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "One-line coaching-session summary used in session lists."
},
"summary_notes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI document: Summary. Saved when the coaching session closes."
},
"started_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"ended_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
],
"description": "Closed when set; In progress when null. This is derived session state, not a stored status enum."
},
"url": {
"type": "string",
"format": "uri",
"description": "Internal app link to coaching session details; distinct from source_url."
},
"duration_minutes": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"actions_created": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"actions_reviewed": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"id",
"vendor",
"source_url",
"type",
"briefing_notes",
"headline",
"summary_notes",
"started_at",
"ended_at",
"url",
"duration_minutes",
"actions_created",
"actions_reviewed"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"window": {
"anyOf": [
{
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"boundary": {
"type": "object",
"properties": {
"at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"source": {
"type": "string",
"enum": [
"session",
"cycle_start",
"none"
]
}
},
"required": [
"at",
"session_id",
"source"
],
"additionalProperties": false
}
},
"required": [
"items",
"next_cursor",
"window",
"boundary"
],
"additionalProperties": false
}[
{
"tool": "session_read",
"collection": "sessions",
"specification": "docs/feature-specs/F7-sessions.md#mcp-source-mapping--selected-target",
"operation": "list",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"sessions.list"
],
"gap": null,
"projection": "List omits documents and preserves resolved window/boundary; stored get preserves nullable session; start explicitly constructs the compact MCP briefing and supported-reader continuations; close preserves saved outcome.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 100
},
"window": {
"type": "object",
"properties": {
"since": {
"description": "Inclusive lower bound. Default: last completed session, falling back to active-cycle start. Date-only values use the profile timezone.",
"anyOf": [
{
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
]
},
{
"type": "string",
"enum": [
"last_session",
"cycle_start"
]
}
]
},
"until": {
"description": "Exclusive upper bound; default is the server time captured on the first page.",
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
]
}
},
"additionalProperties": false
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"operation"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "get"
},
"id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "string",
"const": "last_completed"
}
],
"description": "Exact session UUID, or last_completed for the most recently ended session; returns null when none exists."
}
},
"required": [
"operation",
"id"
],
"additionalProperties": false
}
]
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"anyOf": [
{
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"vendor": {
"type": "string",
"enum": [
"claude",
"openai"
],
"description": "Conversation host: claude is shown as Claude; openai is shown as ChatGPT."
},
"source_url": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "External conversation link used by Open the conversation. Not the app detail URL."
},
"type": {
"anyOf": [
{
"type": "string",
"enum": [
"goal_setup",
"check_in",
"review",
"open_coaching"
],
"description": "Coaching session type: Goal setup, Check-in, Review or Open coaching. Separate from whether the session is still open."
},
{
"type": "null"
}
]
},
"headline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "One-line coaching-session summary used in session lists."
},
"started_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"ended_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
],
"description": "Closed when set; In progress when null. This is derived session state, not a stored status enum."
},
"url": {
"type": "string",
"format": "uri",
"description": "Internal app link to coaching session details; distinct from source_url."
},
"duration_minutes": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"actions_created": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"actions_reviewed": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"id",
"vendor",
"source_url",
"type",
"headline",
"started_at",
"ended_at",
"url",
"duration_minutes",
"actions_created",
"actions_reviewed"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"continuation": {
"anyOf": [
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"const": "session_read"
},
"arguments": {
"type": "object",
"properties": {
"cursor": {
"type": "string",
"minLength": 1
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"window": {
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
},
"operation": {
"type": "string",
"const": "list"
}
},
"required": [
"cursor",
"limit",
"operation"
],
"additionalProperties": false
}
},
"required": [
"tool",
"arguments"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"operation": {
"type": "string",
"const": "list"
},
"window": {
"anyOf": [
{
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"boundary": {
"type": "object",
"properties": {
"at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"source": {
"type": "string",
"enum": [
"session",
"cycle_start",
"none"
]
}
},
"required": [
"at",
"session_id",
"source"
],
"additionalProperties": false
}
},
"required": [
"items",
"next_cursor",
"continuation",
"operation",
"window",
"boundary"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"operation": {
"type": "string",
"const": "get"
},
"session": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"vendor": {
"type": "string",
"enum": [
"claude",
"openai"
],
"description": "Conversation host: claude is shown as Claude; openai is shown as ChatGPT."
},
"source_url": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "External conversation link used by Open the conversation. Not the app detail URL."
},
"type": {
"anyOf": [
{
"type": "string",
"enum": [
"goal_setup",
"check_in",
"review",
"open_coaching"
],
"description": "Coaching session type: Goal setup, Check-in, Review or Open coaching. Separate from whether the session is still open."
},
{
"type": "null"
}
]
},
"briefing_notes": {
"type": "string",
"description": "UI document: Briefing. Server-prepared coaching context."
},
"headline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "One-line coaching-session summary used in session lists."
},
"summary_notes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI document: Summary. Saved when the coaching session closes."
},
"started_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"ended_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
],
"description": "Closed when set; In progress when null. This is derived session state, not a stored status enum."
},
"url": {
"type": "string",
"format": "uri",
"description": "Internal app link to coaching session details; distinct from source_url."
},
"duration_minutes": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"actions_created": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"actions_reviewed": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"id",
"vendor",
"source_url",
"type",
"briefing_notes",
"headline",
"summary_notes",
"started_at",
"ended_at",
"url",
"duration_minutes",
"actions_created",
"actions_reviewed"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"boundary": {
"type": "object",
"properties": {
"at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"source": {
"type": "string",
"enum": [
"session",
"cycle_start",
"none"
]
}
},
"required": [
"at",
"session_id",
"source"
],
"additionalProperties": false
}
},
"required": [
"operation",
"session",
"boundary"
],
"additionalProperties": false
}
]
}
}
]Feature declaration: getSession
Requirement: docs/feature-specs/F7-sessions.md · Access: retained-read
Tables: sessions (read), actions (read)
Trusted context: authenticated actor
Retry: Safe to retry with the same resolved filters and cursor.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "sessions.get",
"service": "sessions.get",
"binding": "bound"
}
][]
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"id"
],
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"session": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"vendor": {
"type": "string",
"enum": [
"claude",
"openai"
],
"description": "Conversation host: claude is shown as Claude; openai is shown as ChatGPT."
},
"source_url": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "External conversation link used by Open the conversation. Not the app detail URL."
},
"type": {
"anyOf": [
{
"type": "string",
"enum": [
"goal_setup",
"check_in",
"review",
"open_coaching"
],
"description": "Coaching session type: Goal setup, Check-in, Review or Open coaching. Separate from whether the session is still open."
},
{
"type": "null"
}
]
},
"briefing_notes": {
"type": "string",
"description": "UI document: Briefing. Server-prepared coaching context."
},
"headline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "One-line coaching-session summary used in session lists."
},
"summary_notes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI document: Summary. Saved when the coaching session closes."
},
"started_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"ended_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
],
"description": "Closed when set; In progress when null. This is derived session state, not a stored status enum."
},
"url": {
"type": "string",
"format": "uri",
"description": "Internal app link to coaching session details; distinct from source_url."
},
"duration_minutes": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"actions_created": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"actions_reviewed": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"id",
"vendor",
"source_url",
"type",
"briefing_notes",
"headline",
"summary_notes",
"started_at",
"ended_at",
"url",
"duration_minutes",
"actions_created",
"actions_reviewed"
],
"additionalProperties": false
},
"actions": {
"type": "object",
"properties": {
"items": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Due. May be unset on a web draft; a set date cannot be cleared."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"sort_order": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Drag order within an action group; not a progress status."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"overdue": {
"type": "boolean"
},
"done_since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"cycle_id",
"objective_id",
"title",
"description",
"due_at",
"status",
"sort_order",
"session_id",
"created_at",
"url",
"overdue",
"done_since_boundary"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"session",
"actions",
"continuations"
],
"additionalProperties": false
}[]
Feature declaration: closeSession
Requirement: docs/feature-specs/F7-sessions.md · Access: entitled-write
Tables: sessions (write)
Trusted context: authenticated actor
Retry: Return the originally saved closure on retry; never overwrite its summary.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "sessions.close",
"service": "sessions.close",
"binding": "bound"
}
][
{
"tool": "session_close",
"collection": "sessions",
"specification": "docs/feature-specs/F7-sessions.md#mcp-source-mapping--selected-target",
"operation": "call",
"binding": "planned",
"mode": "direct",
"readiness": "contract-only",
"services": [
"sessions.close"
],
"gap": null,
"projection": "List omits documents and preserves resolved window/boundary; stored get preserves nullable session; start explicitly constructs the compact MCP briefing and supported-reader continuations; close preserves saved outcome."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"session_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"type": {
"type": "string",
"enum": [
"goal_setup",
"check_in",
"review",
"open_coaching"
],
"description": "Coaching session type: Goal setup, Check-in, Review or Open coaching. Separate from whether the session is still open."
},
"headline": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"summary_notes": {
"type": "string",
"minLength": 1,
"description": "UI document: Summary. Saved when closing the coaching session."
}
},
"required": [
"session_id",
"type",
"headline",
"summary_notes"
],
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"session": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"vendor": {
"type": "string",
"enum": [
"claude",
"openai"
],
"description": "Conversation host: claude is shown as Claude; openai is shown as ChatGPT."
},
"source_url": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "External conversation link used by Open the conversation. Not the app detail URL."
},
"type": {
"anyOf": [
{
"type": "string",
"enum": [
"goal_setup",
"check_in",
"review",
"open_coaching"
],
"description": "Coaching session type: Goal setup, Check-in, Review or Open coaching. Separate from whether the session is still open."
},
{
"type": "null"
}
]
},
"briefing_notes": {
"type": "string",
"description": "UI document: Briefing. Server-prepared coaching context."
},
"headline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "One-line coaching-session summary used in session lists."
},
"summary_notes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI document: Summary. Saved when the coaching session closes."
},
"started_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"ended_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
],
"description": "Closed when set; In progress when null. This is derived session state, not a stored status enum."
},
"url": {
"type": "string",
"format": "uri",
"description": "Internal app link to coaching session details; distinct from source_url."
},
"duration_minutes": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"actions_created": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"actions_reviewed": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"id",
"vendor",
"source_url",
"type",
"briefing_notes",
"headline",
"summary_notes",
"started_at",
"ended_at",
"url",
"duration_minutes",
"actions_created",
"actions_reviewed"
],
"additionalProperties": false
},
"boundary_moved_to": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"session",
"boundary_moved_to"
],
"additionalProperties": false
}[
{
"tool": "session_close",
"collection": "sessions",
"specification": "docs/feature-specs/F7-sessions.md#mcp-source-mapping--selected-target",
"operation": "call",
"binding": "planned",
"mode": "direct",
"readiness": "contract-only",
"services": [
"sessions.close"
],
"gap": null,
"projection": "List omits documents and preserves resolved window/boundary; stored get preserves nullable session; start explicitly constructs the compact MCP briefing and supported-reader continuations; close preserves saved outcome.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"session_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"type": {
"type": "string",
"enum": [
"goal_setup",
"check_in",
"review",
"open_coaching"
],
"description": "Coaching session type: Goal setup, Check-in, Review or Open coaching. Separate from whether the session is still open."
},
"headline": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"summary_notes": {
"type": "string",
"minLength": 1,
"description": "UI document: Summary. Saved when closing the coaching session."
}
},
"required": [
"session_id",
"type",
"headline",
"summary_notes"
],
"additionalProperties": false
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"session": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"vendor": {
"type": "string",
"enum": [
"claude",
"openai"
],
"description": "Conversation host: claude is shown as Claude; openai is shown as ChatGPT."
},
"source_url": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "External conversation link used by Open the conversation. Not the app detail URL."
},
"type": {
"anyOf": [
{
"type": "string",
"enum": [
"goal_setup",
"check_in",
"review",
"open_coaching"
],
"description": "Coaching session type: Goal setup, Check-in, Review or Open coaching. Separate from whether the session is still open."
},
{
"type": "null"
}
]
},
"briefing_notes": {
"type": "string",
"description": "UI document: Briefing. Server-prepared coaching context."
},
"headline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "One-line coaching-session summary used in session lists."
},
"summary_notes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI document: Summary. Saved when the coaching session closes."
},
"started_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"ended_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
],
"description": "Closed when set; In progress when null. This is derived session state, not a stored status enum."
},
"url": {
"type": "string",
"format": "uri",
"description": "Internal app link to coaching session details; distinct from source_url."
},
"duration_minutes": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"actions_created": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"actions_reviewed": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"id",
"vendor",
"source_url",
"type",
"briefing_notes",
"headline",
"summary_notes",
"started_at",
"ended_at",
"url",
"duration_minutes",
"actions_created",
"actions_reviewed"
],
"additionalProperties": false
},
"boundary_moved_to": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"session",
"boundary_moved_to"
],
"additionalProperties": false
}
}
]Feature declaration: queryRecord
Requirement: docs/feature-specs/F7-sessions.md · Access: retained-read
Tables: cycles (read), objectives (read), results (read), result_logs (read), habit_logs (read), actions (read), action_logs (read), notes (read), sessions (read), user (read)
Trusted context: authenticated actor
Retry: Safe to retry with the same resolved filters and cursor.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "record.query",
"service": "record.query",
"binding": "bound"
}
][]
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"filters": {
"type": "object",
"properties": {
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"action_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"note_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"session_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"kinds": {
"minItems": 1,
"type": "array",
"items": {
"type": "string",
"enum": [
"result_logs",
"habit_logs",
"action_logs",
"notes",
"sessions"
]
}
}
},
"additionalProperties": false
},
"window": {
"type": "object",
"properties": {
"since": {
"anyOf": [
{
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
]
},
{
"type": "string",
"enum": [
"last_session",
"cycle_start"
]
}
]
},
"until": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
]
}
},
"additionalProperties": false
},
"continuations": {
"type": "object",
"properties": {
"cycles": {
"type": "string",
"minLength": 1
},
"objectives": {
"type": "string",
"minLength": 1
},
"results": {
"type": "string",
"minLength": 1
},
"actions": {
"type": "string",
"minLength": 1
},
"notes": {
"type": "string",
"minLength": 1
},
"sessions": {
"type": "string",
"minLength": 1
},
"result_logs": {
"type": "string",
"minLength": 1
},
"habit_logs": {
"type": "string",
"minLength": 1
},
"action_logs": {
"type": "string",
"minLength": 1
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"as_of": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"current": {
"type": "object",
"properties": {
"profile": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"name": {
"type": "string",
"description": "Chosen coaching/display name, used verbatim. Target UI prompt: What should we call you? Empty means unknown; no separate surname."
},
"about_me": {
"type": "string",
"description": "UI label: About me."
},
"timezone": {
"type": "string",
"minLength": 1,
"description": "UI label: Time zone. IANA zone used for calendar dates and boundaries."
}
},
"required": [
"id",
"name",
"about_me",
"timezone"
],
"additionalProperties": false
},
"boundary": {
"type": "object",
"properties": {
"at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"source": {
"type": "string",
"enum": [
"session",
"cycle_start",
"none"
]
}
},
"required": [
"at",
"session_id",
"source"
],
"additionalProperties": false
},
"cycle_line": {
"anyOf": [
{
"type": "object",
"properties": {
"range": {
"type": "string"
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100
}
},
"required": [
"range",
"time_gone_pct"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"cycles": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"cycle": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"intention": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Intention. Optional guiding focus; the cycle is identified by its date range, not a name."
},
"start_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Starts."
},
"end_at": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "UI label: Ends."
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"achievement_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Achievement. Derived from objective progress; unavailable when nothing is measurable."
},
"time_gone_pct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "UI label: Time gone. Derived percentage of the cycle elapsed."
},
"length_weeks": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "UI label: Length, in weeks; derived from Starts and Ends."
}
},
"required": [
"id",
"intention",
"start_at",
"end_at",
"status",
"created_at",
"url",
"achievement_pct",
"time_gone_pct",
"length_weeks"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"objectives": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Deadline; null when no deadline has been set."
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Progress. Derived from measurable results, independently of Status."
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Historical progress at the resolved last-session boundary; not current Progress."
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"cycle_id",
"title",
"description",
"deadline_at",
"status",
"created_at",
"short_code",
"url",
"progress_pct",
"boundary_progress_pct",
"movement_pp"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"results": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"boundary_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 1
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"boundary_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Start. Metric baseline; habit baselines are derived rather than stored."
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
}
]
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"actions": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Due. May be unset on a web draft; a set date cannot be cleared."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"sort_order": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Drag order within an action group; not a progress status."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"overdue": {
"type": "boolean"
},
"done_since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"cycle_id",
"objective_id",
"title",
"description",
"due_at",
"status",
"sort_order",
"session_id",
"created_at",
"url",
"overdue",
"done_since_boundary"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"notes": {
"type": "object",
"properties": {
"notes": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"text": {
"type": "string",
"minLength": 1
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"text",
"recorded_at",
"url",
"since_boundary"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"selection": {
"type": "string",
"enum": [
"since_boundary",
"recent_fallback",
"selected",
"history"
]
},
"total": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"notes",
"selection",
"total"
],
"additionalProperties": false
},
"last_completed_session": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"vendor": {
"type": "string",
"enum": [
"claude",
"openai"
],
"description": "Conversation host: claude is shown as Claude; openai is shown as ChatGPT."
},
"source_url": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "External conversation link used by Open the conversation. Not the app detail URL."
},
"type": {
"anyOf": [
{
"type": "string",
"enum": [
"goal_setup",
"check_in",
"review",
"open_coaching"
],
"description": "Coaching session type: Goal setup, Check-in, Review or Open coaching. Separate from whether the session is still open."
},
{
"type": "null"
}
]
},
"briefing_notes": {
"type": "string",
"description": "UI document: Briefing. Server-prepared coaching context."
},
"headline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "One-line coaching-session summary used in session lists."
},
"summary_notes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI document: Summary. Saved when the coaching session closes."
},
"started_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"ended_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
],
"description": "Closed when set; In progress when null. This is derived session state, not a stored status enum."
},
"url": {
"type": "string",
"format": "uri",
"description": "Internal app link to coaching session details; distinct from source_url."
},
"duration_minutes": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"actions_created": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"actions_reviewed": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"id",
"vendor",
"source_url",
"type",
"briefing_notes",
"headline",
"summary_notes",
"started_at",
"ended_at",
"url",
"duration_minutes",
"actions_created",
"actions_reviewed"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"selected": {
"type": "object",
"properties": {
"objective": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"deadline_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Deadline; null when no deadline has been set."
},
"status": {
"type": "string",
"enum": [
"on_track",
"off_track",
"completed"
],
"description": "Objective status: On track, Off track or Completed. Coaching judgment, independent of the derived Progress percentage."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Progress. Derived from measurable results, independently of Status."
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Historical progress at the resolved last-session boundary; not current Progress."
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"cycle_id",
"title",
"description",
"deadline_at",
"status",
"created_at",
"short_code",
"url",
"progress_pct",
"boundary_progress_pct",
"movement_pp"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"result": {
"anyOf": [
{
"oneOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "number"
},
"start_value": {
"type": "number"
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "percentage"
},
"start_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"target_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"boundary_value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "milestone"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 1
},
"unit": {
"type": "null"
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "null"
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"boundary_value": {
"anyOf": [
{
"type": "number",
"const": 0
},
{
"type": "number",
"const": 1
}
]
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "habit"
},
"start_value": {
"type": "number",
"const": 0
},
"target_value": {
"type": "number",
"const": 100
},
"unit": {
"type": "null"
},
"cadence": {
"type": "string",
"enum": [
"weekly",
"monthly"
],
"description": "UI label: Cadence. Weekly or Monthly; per supplies the Times value."
},
"per": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metric_type": {
"type": "string",
"const": "performance"
},
"start_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UI label: Start. Metric baseline; habit baselines are derived rather than stored."
},
"target_value": {
"type": "number"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI label: Unit. Used by Number and Performance results."
},
"cadence": {
"type": "null"
},
"per": {
"type": "null"
},
"since": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"status": {
"type": "string",
"enum": [
"in_progress",
"completed"
],
"description": "Result status: In progress or Completed. Reaching the target does not automatically mark the result completed."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"short_code": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
},
"current_value": {
"type": "number",
"description": "Current value displayed in the result headline; derived according to metric type from its baseline and retained evidence."
},
"boundary_value": {
"type": "number"
},
"progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"boundary_progress_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"movement_pp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"evidence_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"last_recorded_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"habit_expected_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"habit_logs_since_boundary": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"performance_share": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"objective_id",
"title",
"description",
"metric_type",
"start_value",
"target_value",
"unit",
"cadence",
"per",
"since",
"status",
"created_at",
"short_code",
"url",
"current_value",
"boundary_value",
"progress_pct",
"boundary_progress_pct",
"movement",
"movement_pp",
"evidence_count",
"last_recorded_at",
"habit_expected_since_boundary",
"habit_logs_since_boundary",
"performance_share"
],
"additionalProperties": false
}
]
},
{
"type": "null"
}
]
},
"action": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"cycle_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"objective_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
{
"type": "null"
}
],
"description": "UI label: Due. May be unset on a web draft; a set date cannot be cleared."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"sort_order": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Drag order within an action group; not a progress status."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"overdue": {
"type": "boolean"
},
"done_since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"cycle_id",
"objective_id",
"title",
"description",
"due_at",
"status",
"sort_order",
"session_id",
"created_at",
"url",
"overdue",
"done_since_boundary"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"note": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"text": {
"type": "string",
"minLength": 1
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"text",
"recorded_at",
"url",
"since_boundary"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"session": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"vendor": {
"type": "string",
"enum": [
"claude",
"openai"
],
"description": "Conversation host: claude is shown as Claude; openai is shown as ChatGPT."
},
"source_url": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "External conversation link used by Open the conversation. Not the app detail URL."
},
"type": {
"anyOf": [
{
"type": "string",
"enum": [
"goal_setup",
"check_in",
"review",
"open_coaching"
],
"description": "Coaching session type: Goal setup, Check-in, Review or Open coaching. Separate from whether the session is still open."
},
{
"type": "null"
}
]
},
"briefing_notes": {
"type": "string",
"description": "UI document: Briefing. Server-prepared coaching context."
},
"headline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "One-line coaching-session summary used in session lists."
},
"summary_notes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI document: Summary. Saved when the coaching session closes."
},
"started_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"ended_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
],
"description": "Closed when set; In progress when null. This is derived session state, not a stored status enum."
},
"url": {
"type": "string",
"format": "uri",
"description": "Internal app link to coaching session details; distinct from source_url."
},
"duration_minutes": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"actions_created": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"actions_reviewed": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"id",
"vendor",
"source_url",
"type",
"briefing_notes",
"headline",
"summary_notes",
"started_at",
"ended_at",
"url",
"duration_minutes",
"actions_created",
"actions_reviewed"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}
},
"required": [
"objective",
"result",
"action",
"note",
"session"
],
"additionalProperties": false
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"profile",
"boundary",
"cycle_line",
"cycles",
"cycle",
"objectives",
"results",
"actions",
"notes",
"last_completed_session",
"selected",
"continuations"
],
"additionalProperties": false
},
"history": {
"type": "object",
"properties": {
"window": {
"type": "object",
"properties": {
"since": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
},
"result_logs": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"comment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"result_id",
"value",
"comment",
"session_id",
"recorded_at"
],
"additionalProperties": false,
"description": "Result log stored in result_logs. The UI shows value entries under Updates and their non-empty comments under Comments. Value may be null for a comment-only habit entry; evidence and timestamps are immutable."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"habit_logs": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"result_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"day": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Calendar date as YYYY-MM-DD in the profile timezone."
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"result_id",
"day",
"session_id",
"created_at"
],
"additionalProperties": false,
"description": "Habit log stored in habit_logs. The UI marks calendar days and lists them under Updates with the Marked column. One row per result/day; unmarking deletes the row. This is not append-only history."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"action_logs": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"action_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"done"
],
"description": "Action status: Open, In progress or Done. The To do UI group includes Open and In progress; Overdue is derived, not a status."
},
"comment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"session_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
{
"type": "null"
}
]
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"action_id",
"status",
"comment",
"session_id",
"recorded_at"
],
"additionalProperties": false,
"description": "Action log stored in action_logs. Records a status observation and optional comment. Action detail shows Comments, a filtered view rather than the complete status history; status and timestamps are immutable, and only the comment may be cleared."
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"notes": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"text": {
"type": "string",
"minLength": 1
},
"recorded_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"since_boundary": {
"type": "boolean"
}
},
"required": [
"id",
"text",
"recorded_at",
"url",
"since_boundary"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"sessions": {
"type": "object",
"properties": {
"items": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"vendor": {
"type": "string",
"enum": [
"claude",
"openai"
],
"description": "Conversation host: claude is shown as Claude; openai is shown as ChatGPT."
},
"source_url": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "External conversation link used by Open the conversation. Not the app detail URL."
},
"type": {
"anyOf": [
{
"type": "string",
"enum": [
"goal_setup",
"check_in",
"review",
"open_coaching"
],
"description": "Coaching session type: Goal setup, Check-in, Review or Open coaching. Separate from whether the session is still open."
},
{
"type": "null"
}
]
},
"briefing_notes": {
"type": "string",
"description": "UI document: Briefing. Server-prepared coaching context."
},
"headline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "One-line coaching-session summary used in session lists."
},
"summary_notes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "UI document: Summary. Saved when the coaching session closes."
},
"started_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"ended_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
],
"description": "Closed when set; In progress when null. This is derived session state, not a stored status enum."
},
"url": {
"type": "string",
"format": "uri",
"description": "Internal app link to coaching session details; distinct from source_url."
},
"duration_minutes": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"actions_created": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"actions_reviewed": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"id",
"vendor",
"source_url",
"type",
"briefing_notes",
"headline",
"summary_notes",
"started_at",
"ended_at",
"url",
"duration_minutes",
"actions_created",
"actions_reviewed"
],
"additionalProperties": false
}
},
"next_cursor": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"items",
"next_cursor"
],
"additionalProperties": false
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"window",
"result_logs",
"habit_logs",
"action_logs",
"notes",
"sessions",
"continuations"
],
"additionalProperties": false
}
},
"required": [
"as_of",
"current"
],
"additionalProperties": false
}[]
Requirement: docs/feature-specs/F1-identity.md · Access: retained-read
Tables: user (read), subscription (read), oauth_consent (read)
Trusted context: authenticated actor
Retry: Safe to retry with the same resolved filters and cursor.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "user.get",
"service": "user.get",
"binding": "bound"
}
][
{
"tool": "user_read",
"collection": "user",
"specification": "docs/feature-specs/F1-identity.md#mcp-source-mapping--selected-target",
"operation": "call",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"user.get"
],
"gap": null,
"projection": "Project permitted coaching profile only; user_update additionally requires MCP entitlement."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {},
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"name": {
"type": "string",
"description": "Chosen coaching/display name, used verbatim. Target UI prompt: What should we call you? Empty means unknown; no separate surname."
},
"about_me": {
"type": "string",
"description": "UI label: About me."
},
"timezone": {
"type": "string",
"minLength": 1,
"description": "UI label: Time zone. IANA zone used for calendar dates and boundaries."
},
"email": {
"type": "string",
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
"subscription_status": {
"type": "string",
"enum": [
"incomplete",
"active",
"past_due",
"canceled"
],
"description": "Derived from subscription, not a User column: active = Active, past_due = Payment failed, canceled = Canceled, incomplete = Awaiting payment. Only active grants paid access. Scheduled cancellation uses the separate flag; it is not a fifth status."
},
"subscription_cancel_at_period_end": {
"type": "boolean",
"description": "Derived from the selected local subscription; false when none exists."
},
"subscription_current_period_end": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
],
"description": "Derived from the selected local subscription; null when none exists."
},
"connected": {
"type": "boolean",
"description": "True when an OAuth consent row exists for this user, for any client. Indicates prior authorization for onboarding, not current connector liveness."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"name",
"about_me",
"timezone",
"email",
"subscription_status",
"subscription_cancel_at_period_end",
"subscription_current_period_end",
"connected",
"created_at"
],
"additionalProperties": false,
"description": "Account view: chosen name and profile from user, billing state from subscription, and connected from oauth_consent. Auth credentials and provider tokens are not exposed."
}[
{
"tool": "user_read",
"collection": "user",
"specification": "docs/feature-specs/F1-identity.md#mcp-source-mapping--selected-target",
"operation": "call",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"user.get"
],
"gap": null,
"projection": "Project permitted coaching profile only; user_update additionally requires MCP entitlement.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {},
"additionalProperties": false
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"profile": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"name": {
"type": "string",
"description": "Chosen coaching/display name, used verbatim. Target UI prompt: What should we call you? Empty means unknown; no separate surname."
},
"about_me": {
"type": "string",
"description": "UI label: About me."
},
"timezone": {
"type": "string",
"minLength": 1,
"description": "UI label: Time zone. IANA zone used for calendar dates and boundaries."
}
},
"required": [
"id",
"name",
"about_me",
"timezone"
],
"additionalProperties": false
}
},
"required": [
"profile"
],
"additionalProperties": false
}
}
]Feature declaration: updateUser
Requirement: docs/feature-specs/F1-identity.md · Access: account-management
Tables: user (write), subscription (read), oauth_consent (read)
Trusted context: authenticated actor
Retry: Inspect state after uncertain outcomes; never infer rollback from a response failure.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "user.update",
"service": "user.update",
"binding": "bound"
}
][
{
"tool": "user_update",
"collection": "user",
"specification": "docs/feature-specs/F1-identity.md#mcp-source-mapping--selected-target",
"operation": "call",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"user.update"
],
"gap": null,
"projection": "Project permitted coaching profile only; user_update additionally requires MCP entitlement."
}
]{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"name": {
"description": "Chosen coaching/display name; use verbatim. Omit to preserve, empty text clears it.",
"type": "string"
},
"about_me": {
"description": "UI label: About me. Coaching context; omit to preserve, empty text clears it, null is invalid.",
"type": "string",
"maxLength": 4000
},
"timezone": {
"type": "string",
"description": "UI label: Time zone. IANA zone used for calendar dates and boundaries."
}
},
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"record": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"name": {
"type": "string",
"description": "Chosen coaching/display name, used verbatim. Target UI prompt: What should we call you? Empty means unknown; no separate surname."
},
"about_me": {
"type": "string",
"description": "UI label: About me."
},
"timezone": {
"type": "string",
"minLength": 1,
"description": "UI label: Time zone. IANA zone used for calendar dates and boundaries."
}
},
"required": [
"id",
"name",
"about_me",
"timezone"
],
"additionalProperties": false
},
"changed": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"entity": {
"type": "string",
"enum": [
"user",
"cycle",
"objective",
"result",
"result_log",
"action",
"action_log",
"session",
"note",
"habit_log"
]
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"entity",
"id"
],
"additionalProperties": false
}
},
"continuations": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"cycles",
"objectives",
"results",
"actions",
"notes",
"sessions",
"result_logs",
"habit_logs",
"action_logs",
"trend"
]
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"record",
"changed",
"continuations"
],
"additionalProperties": false
}[
{
"tool": "user_update",
"collection": "user",
"specification": "docs/feature-specs/F1-identity.md#mcp-source-mapping--selected-target",
"operation": "call",
"binding": "planned",
"mode": "adapted",
"readiness": "contract-only",
"services": [
"user.update"
],
"gap": null,
"projection": "Project permitted coaching profile only; user_update additionally requires MCP entitlement.",
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"name": {
"description": "Chosen coaching/display name; use verbatim. Omit to preserve, empty text clears it.",
"type": "string"
},
"about_me": {
"description": "UI label: About me. Coaching context; omit to preserve, empty text clears it, null is invalid.",
"type": "string",
"maxLength": 4000
},
"timezone": {
"type": "string",
"description": "UI label: Time zone. IANA zone used for calendar dates and boundaries."
}
},
"additionalProperties": false
},
"output": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"profile": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
},
"name": {
"type": "string",
"description": "Chosen coaching/display name, used verbatim. Target UI prompt: What should we call you? Empty means unknown; no separate surname."
},
"about_me": {
"type": "string",
"description": "UI label: About me."
},
"timezone": {
"type": "string",
"minLength": 1,
"description": "UI label: Time zone. IANA zone used for calendar dates and boundaries."
}
},
"required": [
"id",
"name",
"about_me",
"timezone"
],
"additionalProperties": false
},
"changed": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"entity": {
"type": "string",
"enum": [
"user",
"cycle",
"objective",
"result",
"result_log",
"action",
"action_log",
"session",
"note",
"habit_log"
]
},
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"entity",
"id"
],
"additionalProperties": false
}
}
},
"required": [
"profile",
"changed"
],
"additionalProperties": false
}
}
]Feature declaration: deleteUser
Requirement: docs/feature-specs/F1-identity.md · Access: account-management
Tables: user (delete) · External system: stripe
Trusted context: authenticated actor
Retry: Inspect state after uncertain outcomes; never infer rollback from a response failure.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "user.delete",
"service": "user.delete",
"binding": "bound"
}
][]
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"password": {
"type": "string",
"minLength": 1
}
},
"required": [
"password"
],
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Owned record UUID from fresh tool results or user-selected context. Never invent an ID; clarify ambiguous targets."
}
},
"required": [
"id"
],
"additionalProperties": false
}[]
Feature declaration: createCheckoutSession
Requirement: docs/feature-specs/F1-identity.md · Access: account-management
Tables: user (read), subscription (read) · External system: stripe
Trusted context: authenticated actor
Retry: Inspect state after uncertain outcomes; never infer rollback from a response failure.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "billing.create_checkout_session",
"service": "billing.create_checkout_session",
"binding": "bound"
}
][]
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {},
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"url": {
"type": "string",
"format": "uri"
}
},
"required": [
"url"
],
"additionalProperties": false
}[]
Feature declaration: createBillingPortalSession
Requirement: docs/feature-specs/F1-identity.md · Access: account-management
Tables: user (read) · External system: stripe
Trusted context: authenticated actor
Retry: Inspect state after uncertain outcomes; never infer rollback from a response failure.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR
[
{
"operation": "billing.create_portal_session",
"service": "billing.create_portal_session",
"binding": "bound"
}
][]
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {},
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"url": {
"type": "string",
"format": "uri"
}
},
"required": [
"url"
],
"additionalProperties": false
}[]
Feature declaration: getBillingDetails
Requirement: docs/feature-specs/F1-identity.md · Access: account-management
Tables: subscription (read) · External system: stripe
Trusted context: authenticated actor
Retry: Inspect state after uncertain outcomes; never infer rollback from a response failure.
Expected errors: UNAUTHORIZED, BAD_REQUEST, FORBIDDEN, NOT_FOUND, CONFLICT, NOT_IMPLEMENTED, INTERNAL_SERVER_ERROR, SERVICE_UNAVAILABLE
[
{
"operation": "billing.get_details",
"service": "billing.get_details",
"binding": "bound"
}
][]
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {},
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"plan": {
"anyOf": [
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"description": "UI label: Plan. Provider-backed name of the selected plan."
},
"amount_minor": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991,
"description": "UI label: Price. Recurring plan amount in the currency minor unit; not an invoice total or a tax/credit promise."
},
"currency": {
"type": "string",
"pattern": "^[A-Z]{3}$",
"description": "Three-letter currency code, upper case."
},
"interval": {
"type": "string",
"const": "month",
"description": "One monthly plan only."
},
"interval_count": {
"type": "number",
"const": 1
}
},
"required": [
"name",
"amount_minor",
"currency",
"interval",
"interval_count"
],
"additionalProperties": false,
"description": "The selected subscription plan, read from the billing provider."
},
{
"type": "null"
}
],
"description": "Null when the account has no subscription (shown as No subscription)."
},
"payment_method": {
"anyOf": [
{
"type": "object",
"properties": {
"display": {
"type": "string",
"minLength": 1,
"description": "UI label: Payment method. Display text only, for example Visa ending in 4242; never a full number, token or provider object."
}
},
"required": [
"display"
],
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Null when no payment method applies (shown as No payment method); never a provider failure."
},
"retrieved_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
"description": "When these display details were fetched; not a subscription event ordering token."
}
},
"required": [
"plan",
"payment_method",
"retrieved_at"
],
"additionalProperties": false,
"description": "Settings billing details. Display only: never grants or denies entitlement and is never persisted."
}[]