# roadmap_entry_save

Create or Update Roadmap Entry

## Beschreibung

Linear-style upsert for one row inside a roadmap. Omit `id`
to create, pass `id` to update.

Create requires `roadmap_id`, `title`, AND `due_on`. The
entry inherits its workspace from the parent roadmap. This tool
can't reparent an entry — use `roadmap_entry_move` to move it
to another roadmap in the same workspace.

Field semantics:
- `status` ∈ {planned, in_progress, done, cancelled}. Defaults
  to `planned` on create. Status changes write a
  `RoadmapActivity` row visible via `roadmap_activities`.
- Dates are ISO 8601 (`YYYY-MM-DD`). `due_on` must be on or
  after `starts_on` when both are set.
- `due_on` is mandatory and stays mandatory — there's no
  open-ended state. If the work is genuinely ongoing, split
  it into time-boxed chunks (e.g. one entry per quarter)
  rather than picking a fake date.
- `starts_on` may be null. An entry with no `starts_on`
  renders as a milestone (diamond marker on the timeline)
  at `due_on`.
- `position` is a manual integer ordering inside the
  roadmap; smaller = earlier. Defaults to 0 on create.
- `owner_id` accepts an active human workspace member. It
  defaults to the calling user on create.
- Update semantics: fields you omit are left untouched.

To attach projects, use `roadmap_entry_link_project` — this
tool only manages the entry's own fields.

## Zugriff

Zugriffsprofil: `gated`. Module: `projects_tasks`.
Die Freigabe im Profil ersetzt keine Account-, Workspace- oder Rollenberechtigung.

## Parameter

| Name | Typ | Pflicht | Beschreibung |
| --- | --- | --- | --- |
| `account_id` | string | Ja |  |
| `id` | string | Nein | Entry prefix ID (rent_…). Omit to create. |
| `roadmap_id` | string | Nein | Required on create. Roadmap prefix ID (rmap_…). |
| `title` | string | Nein | Required on create. |
| `description_markdown` | string / null | Nein | Markdown. Empty string clears, null leaves alone. |
| `status` | string | Nein | Defaults to planned on create. |
| `starts_on` | string / null | Nein | ISO date (YYYY-MM-DD). Null/omit → milestone-style entry. |
| `due_on` | string / null | Nein | ISO date (YYYY-MM-DD). REQUIRED on create. Must be >= starts_on when set. |
| `position` | integer | Nein | Manual ordering within the roadmap. Defaults to 0. |
| `owner_id` | string | Nein | Owner user prefix ID or @handle. Defaults to the caller on create. |

## Eingabeschema

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "account_id": {
      "type": "string"
    },
    "id": {
      "type": "string",
      "description": "Entry prefix ID (rent_…). Omit to create."
    },
    "roadmap_id": {
      "type": "string",
      "description": "Required on create. Roadmap prefix ID (rmap_…)."
    },
    "title": {
      "type": "string",
      "description": "Required on create."
    },
    "description_markdown": {
      "type": [
        "string",
        "null"
      ],
      "description": "Markdown. Empty string clears, null leaves alone."
    },
    "status": {
      "type": "string",
      "enum": [
        "planned",
        "in_progress",
        "done",
        "cancelled"
      ],
      "description": "Defaults to planned on create."
    },
    "starts_on": {
      "type": [
        "string",
        "null"
      ],
      "description": "ISO date (YYYY-MM-DD). Null/omit → milestone-style entry."
    },
    "due_on": {
      "type": [
        "string",
        "null"
      ],
      "description": "ISO date (YYYY-MM-DD). REQUIRED on create. Must be >= starts_on when set."
    },
    "position": {
      "type": "integer",
      "description": "Manual ordering within the roadmap. Defaults to 0."
    },
    "owner_id": {
      "type": "string",
      "description": "Owner user prefix ID or @handle. Defaults to the caller on create."
    }
  },
  "required": [
    "account_id"
  ],
  "type": "object"
}
```

## Ausgabeschema

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "entry": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "description": "rent_…"
        },
        "title": {
          "type": "string"
        },
        "status": {
          "type": "string",
          "enum": [
            "planned",
            "in_progress",
            "done",
            "cancelled"
          ]
        },
        "starts_on": {
          "type": [
            "string",
            "null"
          ]
        },
        "due_on": {
          "type": [
            "string",
            "null"
          ]
        },
        "position": {
          "type": "integer"
        },
        "description_markdown": {
          "type": [
            "string",
            "null"
          ]
        },
        "owner": {
          "type": "object",
          "properties": {
            "id": {
              "type": "string"
            },
            "name": {
              "type": "string"
            }
          },
          "required": [
            "id",
            "name"
          ]
        },
        "projects": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "color": {
                "type": [
                  "string",
                  "null"
                ]
              }
            },
            "required": [
              "id",
              "name"
            ]
          }
        },
        "roadmap": {
          "type": "object",
          "properties": {
            "id": {
              "type": "string"
            },
            "title": {
              "type": "string"
            }
          },
          "required": [
            "id",
            "title"
          ]
        }
      },
      "required": [
        "id",
        "title",
        "status",
        "position",
        "owner",
        "projects",
        "roadmap"
      ]
    }
  },
  "required": [
    "entry"
  ],
  "type": "object"
}
```
