Projects
Projects are efforts with a defined goal and an end state — unlike Areas, which are
ongoing. A project is a folder in the vault paired with a project in the task backend:
the folder holds what the project means, the backend holds its tasks (tasks.md).
Every task call is an operation from tasks.md, run per the adapter for TASKS.
Base layer
Read before acting, each as ../../para/<file>.md relative to this skill's base directory — these hold the shared rules, do not restate them from memory:
../../para/paths.md— always, including «Language»: the strings below come fromlang/<LANG>.md../../para/tasks.md— always: the operations, pairing, what a task is../../para/find-target.md— foroverviewandtask../../para/note-format.md— forcreate; for every subcommand, «Legacy fields»../../para/project-id.md— forcreate../../para/dod.md— forcreate(writing theproject.dodsection) andoverview../../para/thresholds.md— forlistandoverview: project order, staleness, horizons, task counts, output size../../para/confirm.md—createandtaskwrite (Tier 1);listandoverviewwrite nothing../../para/move.md— forcreate, before writing a folder that may collide
Subcommands
The first word of $ARGUMENTS picks the subcommand: list, create, overview,
task. If it is none of those, work out which is meant from the phrasing and say which
you picked. Empty $ARGUMENTS → run list, then ask what to do.
Every subcommand meets projects that predate the task backend: status, Tasks/ (note-format.md says when that is legacy), no tasks_ref field. Read them as note-format.md «Legacy fields» says — report, never
rewrite.
create <description> — start a project
Input: what the project is, its goal, deadline, first steps. Empty → ask what the project is and its goal.
-
Read
Templates/Project.mdfrom disk, verbatim. -
Derive a title per
note-format.md. It is used three ways: astitleand the H1 without the id prefix, and — with the prefix — as the folder name and the overview filename. Proposeshortpernote-format.md. -
Issue the id per
project-id.md. -
Create the folder structure under
Projects/:PROJ-xxxx <title>/ ├── PROJ-xxxx <title>.md ← overview, from Templates/Project.md ├── Notes/ ├── Resources/ └── Results/All three subfolders, even empty. No
Tasks/(underTASKS = filesthe adapter creates it with the first task). -
Fill the frontmatter per the Project row in
note-format.md.createdis today.deadlineonly if the description gives one.tasks_refstays blank until step 7 (underpairing: nonethe field is left out). -
Fill the body:
- the
project.goalsection — the goal / desired end state. Required. - the
project.valuesection — what the user gains, measurable or unambiguous (note-format.md, "Three sections about the outcome"). Required. If either this orproject.goalis not clear from the input, ask for both in one question (confirm.md, Tier 1.5) before writing. - the
project.problemsection — what prompted the project. - the
project.expected_resultsection — the concrete artifacts and where they live. - the
project.scopesection — only the items the user named. Usually empty: the research task fills it (tasks.md«The research task»). - the
project.dodsection — checkboxes perdod.md. If the description does not let you derive real checks, ask — as for a missingproject.goal. - the
common.linkssection — wikilinks to clearly related notes, otherwise the template's-.
- the
-
Create the pair per
tasks.md«Pairing»:project.createwith the title and the id. Underpairing: separate, write the returnedrefintotasks_ref:; if the call fails, say so: the folder stays, unpaired, and/projects taskwill offer to pair it later. Underpairing: nonethere is no pair and notasks_ref: skip the write. -
First tasks in the new project, without dates:
- the research task per
tasks.md«The research task», always, unless the user already named the full scope — then write it into theproject.scopesection instead; - steps the user named explicitly, added with
task.addand worded per «What a task is». A step that cannot be worded as an action is a question for the research, not a task.
Never invent steps the user did not name.
- the research task per
-
Report the folder path, id, title,
short(offering to change it), deadline, goal, the value line, the backend project name, and the tasks created.
If the input describes an ongoing responsibility with no end, this is not a project —
say so and offer /areas create instead. If it is an idea the user has not decided to
take on, say that it is not a project yet (tasks.md «Pairing») and offer to leave
it in the inbox (inbox.name).
task <project> <task> — add a task
- Find the project per
find-target.md, operation «Add a task to a project». The target may also be an area project fromAREA_TASK_PROJECTSinareas.md— match it by name. - Resolve where it goes: an area project →
area; otherwise the overview'stasks_ref→project_ref(underpairing: nonethe project folder is therefand this step is just the project).pairing: separateand notasks_refon the overview → say thetask.unpairedstring and offer to create it (step 7 ofcreate). On yes, create the pair, then continue. Never write the task into the vault instead.
- Word the task per
tasks.md«What a task is». If the user's wording already fits, keep it; otherwise propose the reworded version in the announcement. If it cannot be an action, ask for the next step (Tier 1.5). task.addwithproject_reforarea(underTASKS = filesa taken basename is a collision:note-format.md«Name collisions», ask, no silent suffix): the text, a description for anything longer,durationonly if given. The date rule istasks.md«Fields».- Report the task and the project.
overview <project> — where the project stands
Read-only. Writes nothing — not to the vault, not to the backend. If the summary surfaces something worth fixing, say so and let the user decide.
-
Find the project per
find-target.md, operation "Report on". With no argument, list the projects and ask. -
Read the overview note: frontmatter and the sections
project.goal,project.value,project.expected_result,project.dod,common.links. A blank field is reported as blank, never filled in from inference. -
Read the tasks (
task.list, open): their dates and durations. Compute the counts perthresholds.md«Task counts». Underpairing: separate, no pair → skip, and say thetask.unpairedstring. -
Read
Notes/(andResults/, if it has anything) in full, up to the cap inthresholds.md— this is where decisions and risks actually live. -
Legacy. If the overview carries
status/priority/value/estimate, or the folder has a legacyTasks/(note-format.md), add one line, theoverview.legacystring with{fields}such asstatus, Tasks/ (3 files)(the folder count is theoverview.legacy_tasksstring), naming only what is present. Do not read task notes for progress; the migration decides what survives. -
Signals — report only those that fire:
- the project's
deadlinepast, or inside the horizon inthresholds.md; - overdue tasks — say by how many days;
- nothing scheduled while the deadline is inside the horizon;
- dated tasks without a duration;
- quiet longer than the project threshold in
thresholds.md, measured as it says (project.activitywhen paired, mtime otherwise, perthresholds.md); - dangling wikilinks in the
common.linkssection; - every acceptance criterion ticked while the project is still in
Projects/— finished and not closed.
- the project's
-
Render to chat, in
LANG. The labels arelang/<LANG>.mdstrings, named in the template below by key in braces; shown here with the English strings:## PROJ-0001 · Project A **{overview.area}** Area A · **{overview.deadline}** 2026-10-31 — 14 days **{overview.tasks}** {count.scheduled} 3 · {count.overdue} 1 · {count.backlog} 6 **{overview.acceptance}** ☑☐☐ 1/3 ### {overview.essence} <The goal, 1–2 sentences.> <The expected result — one line.> <The value — one line.> ### {overview.scheduled} - **Write the supplier an email** — Tue 10-21, 30 min - **Fill in the form** — overdue by 2 days, 1 h ### {overview.backlog} - Book an appointment - …and 3 more ### {overview.digest} - <A key decision or conclusion from Notes/ — in your own words.> ### {overview.signals} - Deadline in 14 days, nothing scheduledThe braces are keys, not literal text: print the string each key stands for. Dates are the
common.dateformat (2026-10-31;10-31in the short formcommon.date_short, used with a weekday fromcommon.weekdayson a task line); the days to the deadline arecommon.days; unit abbreviations arecommon.unit.*; an overdue task carries thetask.overdue_bystring; the backlog tail is theoverview.backlog_morestring ({n}= tasks not shown). Theoverview.backlogsection shows the oldest undated tasks up to the cap inthresholds.md. Drop any section or field that would be empty. An emptyResults/is a normal state.
list — the projects
Read-only. One line per project — the index, not a summary: never opens Notes/.
-
Enumerate the folders directly under
Projects/. Archived projects are not listed — that is/archive list. -
Read the overview frontmatter:
id,title,area,deadline, and underpairing: separatetasks_ref. A folder with no frontmatter is pre-convention — print it by folder name with thecommon.no_metadatastring. -
Read the tasks of each project that has a
ref(task.listwithproject_ref, open), counted perthresholds.md«Task counts». -
Order per
thresholds.md«Project order». -
Render, in
LANG, with thelist.*,count.*andtask.unpairedstrings — the line is tight, so the backlog count iscount.backlog_short(headerlist.header, deadlinelist.untilwith the date incommon.date_shortand, inside the horizon ofthresholds.md,(14 d)after it: the days to go andcommon.unit.day); shown here with the English strings:**Projects (4)** 1. PROJ-0008 Project A — Area A · until 10-31 (14 d) · scheduled 2 · backlog 3 2. PROJ-0020 Project B — until 10-31 (14 d) · scheduled 0 · backlog 3 3. PROJ-0009 Project C — Area B · until 02-28 · no pair in the task manager · old format 4. PROJ-0027 Project D — backlog empty No pair in the vault: «Project E»- A past deadline: the
list.deadline_passedstring. - The
list.legacystring when legacy fields are present, or a legacyTasks/is. - A project whose backlog is empty: the
list.backlog_emptystring. - The last line (
list.orphans) names backend projects that no overview points at, found astasks.md«Notes on the table»,project.list, says. Drop it when empty or when the adapter does not supportproject.list. - Drop any blank field rather than printing a placeholder. An empty
Projects/is a valid answer: say it plainly.
- A past deadline: the
Archived and pre-convention projects
Projects in Archive/ may predate the conventions: no frontmatter, no PROJ-xxxx
prefix, no subfolders. Read the project.goal section from the note, skip the tasks
section and overview.acceptance, and state plainly that it is archived and in the old format.
Notes
- Compute, don't estimate: day counts, task counts and overdue spans come from the backend, the files and today's system date. If something cannot be computed because a field is blank, say it is blank rather than guessing.
- A summary reports on state; it does not judge the user. "overdue by 5 days", not "you abandoned the project".
- Everything in
LANG, tasks included.