Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Creation and lifecycle tools

Tools that create new notes or move existing ones through their lifecycle.

Creation

ToolInputsEffect
create_projecttitle, context, core_question?, slug?, vars?Create a project (parked if at the active cap). (cdno project create)
create_portfolioquestion, project?, slug?, vars?Create an evidence portfolio. question is free text or an existing question’s slug; given a slug, the portfolio takes that question’s text as its title, links both ways, and slug must be omitted or equal to it (portfolio_slug_mismatch otherwise).
create_questiondomain (research|life), text, slug?, vars?Create a question note.
create_stewardshipname, context, expanded?, slug?, vars?Create a stewardship; expanded adds a tracking/ folder.
create_custom_notetype_name, title, fields?, slug?, vars?, body?, origin?Create a note of a config-defined custom type ([note_types.<name>]); built-in types have their own dedicated create tools, on this page and under Write tools. fields is a name → value map of the type’s declared frontmatter fields — every required one must be present, and each key must be declared. body excludes the title heading (the engine writes the H1) and fills the template’s {{body}} placeholder, or is inserted after the H1; origin is one string of wikilinks to where the note came from, always stored as a frontmatter string, and is refused unless the type declares an origin field. Creation is logged to today’s daily note as <type> created [[<folder>/<slug>]] — <title>; a promotion (creation with origin) needs no other log line. Pass slug to name the file; passing it beside a slug entry in fields is refused (slug_given_twice). Without slug, a second note with the same title is not refused but created as <slug>-2, so for a concept, search the library (search_notes with note_type: concept) and refine an existing note with revise_note instead. Call list_note_types first to discover a vault’s types and their fields. (cdno note create)
link_portfolio_to_questionportfolio, questionRetrofit a portfolio→question link (backlinks both ways).
link_portfolio_to_projectportfolio, projectRetrofit a portfolio→project link (sets project: and appends to the project’s Links).

Lifecycle

ToolInputsEffect
park_projectprojectMove an active project to _parked/.
complete_projectprojectClose an active or parked project whose work is done: move it to _done/<year>/ with status: completed and closed:. Refused while any action or milestone is open. (cdno project complete)
drop_projectproject, reason?, open_items? (refuse|drop), expected_open_items?Close an active or parked project that is not going to happen: status: dropped, closed:, moved to _done/<year>/. Refused with the open items by default; open_items: "drop" with the refusal’s hash drops them too. (cdno project drop)
activate_projectprojectBring a parked or closed project back, clearing closed: (enforces the five-project cap).
set_question_statusquestion, status (active|parked|answered|retired)Transition a question’s status.
add_periodic_commitmentstewardship, title, recurrence, next_dateAppend a periodic commitment to a stewardship dashboard.

The holder

ToolInputsEffect
hand_off_projectproject, holder?, take_back?Record whose move an open (active or parked) project is. Exactly one of holder (the name the person gives, written as held_by: "<name>") or take_back: true (writes held_by: null); omitting both is an error, never a silent take-back. The map keeps its status and folder. Logs holder on [[<slug>]] with indented was: / now: lines, (mine) for no holder; naming the holder it already has changes nothing. (cdno project hand-off, take-back)

An active project that names a holder does not count toward the cap (counts: false, and slots.counted on list_projects leaves it out). Handing off is never the way to make room at the cap: call it only on the person’s word that someone else is moving the project. Rejections:

  • empty_field (remedy: take_back): an empty holder, or one on the vault’s [projects] holder_sentinels (a name meaning the person or no one in particular). If they cannot name who has it, it is theirs.
  • project_in_focus: an action on the project is in focus; the person pauses it first.
  • project_cap_reached: taking back an active project would make it count with the counted projects already at the cap; its details carry current, max and active_projects, which lists only the projects that count. Taking back a parked project only clears the name and never activates it.
  • project_not_active: the project is completed or dropped.

The tool also appears with the other project writes under Write tools.

Naming a note

The eight create tools (create_project, create_question, create_portfolio, create_stewardship, create_custom_note, add_action, promote_action, create_commitment) take an optional slug naming the new note’s file; omitted, it is derived from the title. Propose one when the title is long. It follows the slug rule: lowercase a-z, 0-9 and single -, at most 50 characters, not something YAML reads as a number, boolean, null or date. An explicit slug is used exactly or refused, never suffixed with -2. Refusals are coded rejections with nothing written: invalid_slug, slug_taken, portfolio_slug_mismatch and slug_given_twice, listed with their details under When a call is rejected. add_action ignores slug unless with_note is true: an inline bullet has no file.

Notes

  • context is one of the fixed life domains.
  • recurrence follows the recurrence syntax: daily, weekly, monthly, yearly, or every N months.
  • activate_project enforces the cap — if activating would make more projects count than the cap (active and naming no holder), the call fails and the assistant must park one first.
  • Closing a project never needs a slot, and works on a parked project directly. While an action or milestone is open, both closing tools return a project_has_open_items rejection whose details list the actions, the milestones (with date and hard), the untouched_commitments (linked standalone commitments, which no close ever touches) and an open_items_hash. complete_project stays refused until each item is completed or dropped: a completion is a claim that the work was done. drop_project with open_items: "drop" and expected_open_items set to that hash drops every listed item with the project, each logged with reason: project dropped (<reason>) (plain reason: project dropped when no reason was given); if the list has changed since, it is refused again with the new list and hash. The result names dropped_actions, dropped_milestones and untouched_commitments.
  • A closed project can take the other outcome later (complete_project on a dropped one, and the reverse), re-filed under this year’s folder with a new closed: date. The same outcome again is a project_not_active rejection whose details carry status and closed.
  • vars? is an optional name -> value map supplying values for a custom template’s [variables.prompt] placeholders — the MCP analogue of the CLI’s repeatable --var name=value. Supply an entry for each prompted variable the note’s template uses that has no static [variables] default; otherwise creation fails with an “unresolved prompts” error (MCP has no interactive prompt to fall back on).
  • See also: Write tools, Context-gathering tools.