Project Tracking
Manage project records in the user's Obsidian second brain. Use second-brain for shared vault conventions and task-tracking when task state must be created or changed.
Data Source
- Vault config (path, timezone): see
second-brain -> Vault.
- Project note:
Projects/[Project Name]/[Project Name].md — named after the project so [[Project Name]] wikilinks resolve to it. Created with obsidian__note_create type="project"; the path is derived, never hand-constructed.
- Central task file:
Tasks.md, written through obsidian__task_add and obsidian__task_update.
- Adding a table row or a line under a heading is
obsidian__section_append, which targets the named section rather than the end of the file.
- A dated entry in the running
## Activity Log is obsidian__log_append, which writes the ### YYYY-MM-DD heading itself and keeps the newest day at the top. That section is not a obsidian__section_append target.
Project Note Template
---
type: project
status: Active
created: YYYY-MM-DD
started: YYYY-MM-DD
people: []
topics: []
---
# [Project Name]
**Description:** One-line description
## Stakeholders
- [[First Last]] — Role
- Org or team name — Role (plain text for orgs; wikilinks for people)
## Key Decisions
| Date | Decision | Reasoning |
|------|----------|-----------|
## Conversation Log
| Date | Who | Summary |
|------|-----|---------|
## Waiting On
| What | Who | Since |
|------|-----|-------|
## Related Tasks
- Task text (see [[Tasks]])
## Activity Log
### YYYY-MM-DD
- What happened, newest date first
## Related
- [[Knowledge note or other related note]] — why it is related
Status values: Active, On Hold, Blocked, Done, Archived. Status lives in frontmatter (status:), not in the body, so Bases and queries can read it. Archived is set by resurfacing, never inferred by this skill — see second-brain -> Frontmatter Standards.
people: holds quoted wikilinks to person notes: people: ["[[First Last]]"]. topics: holds plain topic strings: topics: [video, playback].
Workflow
When creating a project:
- Normalize the project name to Title Case unless the user gives exact casing.
obsidian__note_create type="project" name="[Project Name]" — the server creates the folder, the note, the frontmatter, and the standard sections. Pass known values through fields, e.g. fields={"status":"Active","people":"Jane Doe, Sam Lee","description":"One line"}; people becomes quoted wikilinks.
- If the user supplied a written brief — a spec, a plan, hardware or API details, a phased roadmap, anything with its own headings — the brief is the deliverable, not raw material for a summary. Create
obsidian__note_create type="doc" name="technical-brief" project="[Project Name]" body="<the full text>" first, before filling any section, and wikilink it from ## Related. A doc note gets no section skeleton precisely so it can hold a document whole. Demote the brief's headings one level so the note keeps a single H1.
- Fill the project note's sections with
obsidian__section_append. Use [[First Last]] wikilinks for every person named. The sections summarize and point at the doc; they never replace it.
- If the user also gives actionable work, route to
task-tracking to add tasks to Tasks.md.
When updating a project:
Read the existing project note.
Append to the relevant section with obsidian__section_append, and keep the status, people, and topics properties in sync with obsidian__note_set_field note="[Project Name]" field="status" value="On Hold". Stale frontmatter is not cosmetic: standup lists active projects with obsidian__vault_list type="project" status="Active", so a project left Active after it stops is reported as live work every weekday until someone notices.
Log what happened in the ## Activity Log:
obsidian__log_append note="[Project Name]" section="Activity Log" content="Proposal sent; awaiting response"
Pass the entry text only — no date prefix and no bullet marker. Never use obsidian__section_append on that section: it drops a bare line above every dated block, which is where the CLI-written entries of 2026-08-01 ended up.
A project note written before the template carried ## Activity Log will not have one, and the call fails naming the sections it does have. Add create_section=true to that call and the heading is created in template position.
If the call is refused as too similar to an entry already in that day's block, you already logged this — the error quotes the entry it collides with. Do not reword and retry; that is exactly how one turn wrote the same board purchase into a log three times. allow_similar=true is for a genuinely separate event that happens to read alike, not for getting past the message.
To undo an entry this system wrote by mistake, use obsidian__log_remove note="[Project Name]" section="Activity Log" date="YYYY-MM-DD" match="<text from the entry>". It is the only tool here that deletes, it touches one dated block, and it exists so that fixing a bad entry never means editing the file directly. Do not use it on entries the user wrote — if something is merely out of date, log a new entry saying so.
Add dates using the local timezone.
Preserve existing tables and user wording where possible.
Wikilink people in the Who columns of Conversation Log and Waiting On.
If task state changes are implied but not explicit, mention the possible task update instead of changing Tasks.md silently.
Project-Task Relationship
- Treat the project note as the source of project state.
- Treat
Tasks.md as the source of task state.
- Tasks link to the project with a
[[Project Name]] wikilink that exactly matches the project note name.
- Use
## Related Tasks in the project note to reference important tasks by exact task text.
- Do not duplicate full task lists inside project files; keep task state centralized in
Tasks.md.
- When a project is marked
Done, do not automatically complete all related tasks unless the user explicitly asks.
- When all related tasks are done, do not automatically mark the project
Done unless the user explicitly asks.
- If project status and task status conflict, preserve both and call out the inconsistency.
Meeting Notes and Docs
Both are created with obsidian__note_create, which derives the folder from the type and the project and writes the frontmatter. Never place these files by hand.
Meeting notes — obsidian__note_create type="meeting" name="YYYY-MM-DD BriefDescription" project="Project Name":
- Include attendees (as
[[First Last]] wikilinks), discussion points, decisions, and action items when available.
- Add a brief entry to the project note's
## Conversation Log pointing to the meeting note with a wikilink.
- Route action items to
task-tracking when they are concrete tasks.
Docs — obsidian__note_create type="doc" name="vendor-comparison" project="Project Name" — for drafts, research, and references:
- Name files descriptively:
draft-proposal, vendor-comparison. Generic names are refused, which is why the older Docs/INDEX.md files could never be linked to.
- A doc gets no section skeleton; its shape is yours. Pass the opening prose as
body and fill the rest with obsidian__section_append.
- Add a concise docs note to the project note when useful.
Conversations and Waiting Items
- Log project conversations in
## Conversation Log with date, who (wikilinked), and summary.
- For person-specific relationship context, also route to
people-notes.
- Add blockers and external dependencies to
## Waiting On with what, who (wikilinked), and since date.
- If a waiting item should be tracked as work, route to
task-tracking and use Waiting On Others.
Safety
- Never compress supplied material to make it fit a section. The project template has no section shaped like a spec, so a brief pushed into
## Key Decisions arrives as a table row with the wrong number of cells and the server rejects it. That rejection means the content has no home yet — create the doc note. It does not mean write one summary line and drop the rest. On 2026-08-02 a full ESP32 hardware and API brief became a single decision row this way, and nothing else survived.
- Detail is lost silently. A section that is merely thin looks the same as one the user never filled in, so there is no later signal that anything went missing — the check has to happen while the material is still in front of you.
- Do not invent project metadata.
- Do not create tasks without clear actionable wording.
- Do not create a project from a vague idea unless the user asks to track it as a project; otherwise capture it to
Inbox.md or use the idea pipeline if appropriate.
1---2name: project-tracking3description: Track work projects in the Obsidian vault: create/update project notes, status, key decisions, blockers, meeting notes, docs, and stakeholder links. Use for project state and project conversations. NOT for: individual tasks (task-tracking), pre-project ideas (idea-pipeline), or evergreen reference (knowledge-base).4---56# Project Tracking78Manage project records in the user's Obsidian second brain. Use `second-brain` for shared vault conventions and `task-tracking` when task state must be created or changed.910## Data Source1112- Vault config (path, timezone): see `second-brain` -> Vault.13- Project note: `Projects/[Project Name]/[Project Name].md` — named after the project so `[[Project Name]]` wikilinks resolve to it. Created with `obsidian__note_create type="project"`; the path is derived, never hand-constructed.14- Central task file: `Tasks.md`, written through `obsidian__task_add` and `obsidian__task_update`.15- Adding a table row or a line under a heading is `obsidian__section_append`, which targets the named section rather than the end of the file.16- A dated entry in the running `## Activity Log` is `obsidian__log_append`, which writes the `### YYYY-MM-DD` heading itself and keeps the newest day at the top. That section is not a `obsidian__section_append` target.1718## Project Note Template1920```markdown21---22type: project23status: Active24created: YYYY-MM-DD25started: YYYY-MM-DD26people: []27topics: []28---2930# [Project Name]3132**Description:** One-line description3334## Stakeholders3536- [[First Last]] — Role37- Org or team name — Role (plain text for orgs; wikilinks for people)3839## Key Decisions4041| Date | Decision | Reasoning |42|------|----------|-----------|4344## Conversation Log4546| Date | Who | Summary |47|------|-----|---------|4849## Waiting On5051| What | Who | Since |52|------|-----|-------|5354## Related Tasks5556- Task text (see [[Tasks]])5758## Activity Log5960### YYYY-MM-DD6162- What happened, newest date first6364## Related6566- [[Knowledge note or other related note]] — why it is related67```6869Status values: `Active`, `On Hold`, `Blocked`, `Done`, `Archived`. Status lives in frontmatter (`status:`), not in the body, so Bases and queries can read it. `Archived` is set by `resurfacing`, never inferred by this skill — see `second-brain` -> Frontmatter Standards.7071`people:` holds quoted wikilinks to person notes: `people: ["[[First Last]]"]`. `topics:` holds plain topic strings: `topics: [video, playback]`.7273## Workflow7475When creating a project:76771. Normalize the project name to Title Case unless the user gives exact casing.782. `obsidian__note_create type="project" name="[Project Name]"` — the server creates the folder, the note, the frontmatter, and the standard sections. Pass known values through `fields`, e.g. `fields={"status":"Active","people":"Jane Doe, Sam Lee","description":"One line"}`; `people` becomes quoted wikilinks.793. If the user supplied a written brief — a spec, a plan, hardware or API details, a phased roadmap, anything with its own headings — **the brief is the deliverable, not raw material for a summary.** Create `obsidian__note_create type="doc" name="technical-brief" project="[Project Name]" body="<the full text>"` first, before filling any section, and wikilink it from `## Related`. A doc note gets no section skeleton precisely so it can hold a document whole. Demote the brief's headings one level so the note keeps a single H1.804. Fill the project note's sections with `obsidian__section_append`. Use `[[First Last]]` wikilinks for every person named. The sections summarize and point at the doc; they never replace it.815. If the user also gives actionable work, route to `task-tracking` to add tasks to `Tasks.md`.8283When updating a project:84851. Read the existing project note.862. Append to the relevant section with `obsidian__section_append`, and keep the `status`, `people`, and `topics` properties in sync with `obsidian__note_set_field note="[Project Name]" field="status" value="On Hold"`. Stale frontmatter is not cosmetic: `standup` lists active projects with `obsidian__vault_list type="project" status="Active"`, so a project left `Active` after it stops is reported as live work every weekday until someone notices.873. Log what happened in the `## Activity Log`:8889 ```90 obsidian__log_append note="[Project Name]" section="Activity Log" content="Proposal sent; awaiting response"91 ```9293 Pass the entry text only — no date prefix and no bullet marker. Never use `obsidian__section_append` on that section: it drops a bare line above every dated block, which is where the CLI-written entries of 2026-08-01 ended up.9495 A project note written before the template carried `## Activity Log` will not have one, and the call fails naming the sections it does have. Add `create_section=true` to that call and the heading is created in template position.9697 If the call is refused as **too similar** to an entry already in that day's block, you already logged this — the error quotes the entry it collides with. Do not reword and retry; that is exactly how one turn wrote the same board purchase into a log three times. `allow_similar=true` is for a genuinely separate event that happens to read alike, not for getting past the message.9899 To undo an entry this system wrote by mistake, use `obsidian__log_remove note="[Project Name]" section="Activity Log" date="YYYY-MM-DD" match="<text from the entry>"`. It is the only tool here that deletes, it touches one dated block, and it exists so that fixing a bad entry never means editing the file directly. Do not use it on entries the user wrote — if something is merely out of date, log a new entry saying so.1004. Add dates using the local timezone.1015. Preserve existing tables and user wording where possible.1026. Wikilink people in the `Who` columns of Conversation Log and Waiting On.1037. If task state changes are implied but not explicit, mention the possible task update instead of changing `Tasks.md` silently.104105## Project-Task Relationship106107- Treat the project note as the source of project state.108- Treat `Tasks.md` as the source of task state.109- Tasks link to the project with a `[[Project Name]]` wikilink that exactly matches the project note name.110- Use `## Related Tasks` in the project note to reference important tasks by exact task text.111- Do not duplicate full task lists inside project files; keep task state centralized in `Tasks.md`.112- When a project is marked `Done`, do not automatically complete all related tasks unless the user explicitly asks.113- When all related tasks are done, do not automatically mark the project `Done` unless the user explicitly asks.114- If project status and task status conflict, preserve both and call out the inconsistency.115116## Meeting Notes and Docs117118Both are created with `obsidian__note_create`, which derives the folder from the type and the project and writes the frontmatter. Never place these files by hand.119120Meeting notes — `obsidian__note_create type="meeting" name="YYYY-MM-DD BriefDescription" project="Project Name"`:121122- Include attendees (as `[[First Last]]` wikilinks), discussion points, decisions, and action items when available.123- Add a brief entry to the project note's `## Conversation Log` pointing to the meeting note with a wikilink.124- Route action items to `task-tracking` when they are concrete tasks.125126Docs — `obsidian__note_create type="doc" name="vendor-comparison" project="Project Name"` — for drafts, research, and references:127128- Name files descriptively: `draft-proposal`, `vendor-comparison`. Generic names are refused, which is why the older `Docs/INDEX.md` files could never be linked to.129- A doc gets no section skeleton; its shape is yours. Pass the opening prose as `body` and fill the rest with `obsidian__section_append`.130- Add a concise docs note to the project note when useful.131132## Conversations and Waiting Items133134- Log project conversations in `## Conversation Log` with date, who (wikilinked), and summary.135- For person-specific relationship context, also route to `people-notes`.136- Add blockers and external dependencies to `## Waiting On` with what, who (wikilinked), and since date.137- If a waiting item should be tracked as work, route to `task-tracking` and use `Waiting On Others`.138139## Safety140141- **Never compress supplied material to make it fit a section.** The project template has no section shaped like a spec, so a brief pushed into `## Key Decisions` arrives as a table row with the wrong number of cells and the server rejects it. That rejection means the content has no home yet — create the doc note. It does not mean write one summary line and drop the rest. On 2026-08-02 a full ESP32 hardware and API brief became a single decision row this way, and nothing else survived.142- Detail is lost silently. A section that is merely thin looks the same as one the user never filled in, so there is no later signal that anything went missing — the check has to happen while the material is still in front of you.143- Do not invent project metadata.144- Do not create tasks without clear actionable wording.145- Do not create a project from a vague idea unless the user asks to track it as a project; otherwise capture it to `Inbox.md` or use the idea pipeline if appropriate.