Files
stack/packages/tasks/fields.json
T
jason.woltjeandClaude Opus 5.5 6c42344d9d tasks, webui: the task field-writer table as data (#1550)
Row 61. packages/tasks/fields.json holds the slice 1 field table in two
layers (decision 113): each broker task verb's writer check, and each
field's writing verbs and Vikunja calls. packages/tasks/src/fields.mjs
checks the shape as code and loads it frozen. The tasks test reads the
writer layer from the table and authority from roles/*.json and drives
every task verb against the fake Vikunja. The Console serves the table
at GET /api/task-fields, and the task page shows a "Who may write"
section. The slice 1 doc's field table points to the file.

Darkwing's round 1, candidate manifest 33b96986, base 4f8ac1e7. Approved
by Dewey (27776) and Filbert (27785). Sage's gate green 18:57:31Z to
19:01:58Z.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-12 14:02:56 -05:00

94 lines
2.9 KiB
JSON

{
"source": "docs/plans/2026-10-04_slice-1.md, Field table (lead decisions 90 and 113)",
"verbs": {
"task.create": "pm",
"task.assign": "pm",
"task.reassign": "pm",
"task.schedule": "pm",
"task.priority.change": "pm",
"task.scope.change": "any",
"task.update.assigned": "assigned",
"task.close": "pm"
},
"fields": [
{
"field": "title",
"label": "Title",
"writes": [
{ "verb": "task.create", "calls": ["POST /projects/{p}/tasks"] },
{ "verb": "task.scope.change", "calls": ["PATCH /tasks/{t}"] }
]
},
{
"field": "description",
"label": "Description",
"writes": [
{ "verb": "task.create", "calls": ["POST /projects/{p}/tasks"] },
{ "verb": "task.scope.change", "calls": ["PATCH /tasks/{t}"] }
]
},
{
"field": "due_date",
"label": "Due date",
"writes": [
{ "verb": "task.create", "calls": ["POST /projects/{p}/tasks"] },
{ "verb": "task.schedule", "calls": ["PATCH /tasks/{t}"] }
]
},
{
"field": "priority",
"label": "Priority",
"writes": [
{ "verb": "task.create", "calls": ["POST /projects/{p}/tasks"] },
{ "verb": "task.priority.change", "calls": ["PATCH /tasks/{t}"] }
]
},
{
"field": "percent_done",
"label": "Percent done",
"writes": [{ "verb": "task.update.assigned", "calls": ["PATCH /tasks/{t}"] }]
},
{
"field": "bucket",
"label": "State (bucket) other than done",
"writes": [{ "verb": "task.update.assigned", "calls": ["PUT /projects/{p}/views/{k}/buckets/{b}/tasks"] }]
},
{
"field": "done",
"label": "Done",
"note": "Cites a review verdict, which is recorded and not checked.",
"writes": [{ "verb": "task.close", "calls": ["PUT /projects/{p}/views/{k}/buckets/{b}/tasks"] }]
},
{
"field": "assignees",
"label": "Assignees",
"writes": [
{ "verb": "task.assign", "calls": ["POST /tasks/{t}/assignees"] },
{ "verb": "task.reassign", "calls": ["POST /tasks/{t}/assignees", "DELETE /tasks/{t}/assignees/{u}"] }
]
},
{
"field": "labels",
"label": "Labels",
"writes": [
{ "verb": "task.create", "calls": ["POST /tasks/{t}/labels"] },
{ "verb": "task.schedule", "calls": ["POST /tasks/{t}/labels", "DELETE /tasks/{t}/labels/{l}"] }
]
},
{
"field": "relations",
"label": "Relations",
"writes": [
{ "verb": "task.create", "calls": ["POST /tasks/{t}/relations"] },
{ "verb": "task.schedule", "calls": ["POST /tasks/{t}/relations", "DELETE /tasks/{t}/relations/{kind}/{other}"] }
]
},
{
"field": "comments",
"label": "Comments",
"note": "Append only.",
"writes": [{ "verb": "task.update.assigned", "calls": ["POST /tasks/{t}/comments"] }]
}
]
}