---
title: The Task Graph: One Database, Labels per Venture
description: Why tasks live in a dependency-aware, git-backed tracker instead of Markdown lists; the two labels every task carries; and the flags that carry the workflow.
track: core
url: https://www.chiefofstaff.io/guides/the-task-graph
published: 2026-09-01
author: chiefofstaff.io editorial system
outcome: initialise a single task database in the vault, label every task with a venture and one of four cognitive modes, and refuse to invent a fifth.
prerequisites: the-vault
source: chiefofstaff.io
---

# The Task Graph: One Database, Labels per Venture

Why tasks live in a dependency-aware, git-backed tracker instead of Markdown lists; the two labels every task carries; and the flags that carry the workflow.

## Why Not a Markdown List

Markdown files are a poor task tracker: no statuses, no dependencies, no queries, no way for an agent to ask "what is ready to work on?" So tasks live in [beads](https://github.com/gastownhall/beads) (`bd`), an open-source, git-backed, dependency-aware issue tracker designed for AI agents. The task data is JSONL inside the vault, so it versions and travels with everything else.

Claude Code picks it up naturally: agents run `bd` from the shell, and every mutation is plain text in git history. Your assistant creates tasks as it triages; the daily brief queries the graph; the weekly review walks it.

```bash
bd init                                  # creates .beads/ in the vault root
bd create --title="…" --priority=2 --label=… --label=…
bd ready                                 # tasks with no open blockers
bd dep add <task> <blocker>              # real dependencies are first-class
bd blocked                               # what's stuck, and on what
bd close <id> --reason="…"
```

If you are starting without beads, a single `tasks.md` with the same labelling conventions works for a week or two. Graduate when the brief starts wanting to *query*.

## One Database for Everything

A portfolio's value hides in its cross-venture dependencies — the lawyer's answer that unblocks two companies, the trip that collides with three deadlines. So there is exactly **one** task database, with a label per venture, rather than one database per venture. Cross-venture dependencies become ordinary `bd dep` edges instead of things you remember to remember.

![Every task carries a venture label and one of four cognitive-mode labels; optional flags — waiting, unconfirmed, cos-exec — carry the workflow.](/img/diagrams/beads-labels.svg)

## Two Required Labels on Every Task

**A venture label**, matching a folder in `Atlas/ventures/`. The system's own meta-work gets its own label (`cos`). There is deliberately no `personal` or `misc` catch-all: a label with no venture folder behind it is a place where tasks go to be un-reviewed. Life-admin captures route to real ventures by a fixed table — money to `personal-finance`, account and device admin to `personal-ops`, reading to `learning`, couple things to the relationship venture.

**A cognitive-mode label**, from a hard-capped set of four:

| Label | Means |
|---|---|
| `@deep` | needs a 90-minute uninterrupted block |
| `@async` | an email, chat, or message reply; batchable |
| `@call` | needs a live conversation |
| `@quick` | under 15 minutes, any context |

This is Getting Things Done, adapted. Location contexts (`@office`, `@phone`) mean nothing to someone who works from anywhere; *kind of attention* means everything. The daily brief filters your top three by the shape of the day: long free blocks surface `@deep` work, a travel day surfaces `@async` and `@quick`. The four-label cap is written into a decision record and enforced as an anti-pattern — context-list bloat is the most documented way GTD systems die, and within a month of "just one more" you have twelve contexts, none used consistently.

## Optional Flags That Carry the Workflow

- **`waiting`** — the next move is on someone else. The notes name who and carry a follow-up date; the weekly review surfaces anything aging past it. Apply liberally: any task where the ball is in someone else's court belongs here.
- **`unconfirmed`** — the task was pre-drafted by a curator from something it saw (an email, a calendar conflict) and awaits your disposition: confirm, dismiss, defer, re-label, or close-as-done. Default priority is low; curators may raise it only for genuinely time-sensitive items — a deadline within a week, past-due billing, a security alert, a conflict on today's calendar. See [Incremental handling](/guides/incremental-handling).
- **`cos-exec`** — the doer is the chief of staff, not you: a report, a research answer, a document. The label alone routes the task into an execution lane. See [The execution lane](/guides/the-execution-lane).
- **Domain tags** (`fundraising`, `legal`, `hiring`) — secondary, only when useful.

`blocked` is a *status*, not a label, and it is reserved for tasks that literally depend on another task via `bd dep`. "Blocked on a feeling" is `waiting` with a name in the notes.

## Priorities

Priority is a number, 0 to 4. The convention that has held: P0 is a fire, P1 is this week and non-negotiable, P2 is the working set, P3 is the backlog and the default for curator-drafted items, P4 is someday-but-tracked. The brief and the review tool key off it, so an inflated P1 list is a signal the triage layer is slipping.

## Examples

```bash
bd create --title="Reply to lead investor on the term sheet" \
          --label=venture-a --label=@async --label=fundraising --priority=1
bd create --title="2hr deep work: refactor the billing module" \
          --label=venture-a --label=@deep --priority=2
bd create --title="Waiting on J: reorg plan (followup 2026-05-03)" \
          --label=venture-a --label=waiting --label=@async
bd create --title="Report on options for X — deliver: report+file" \
          --label=cos --label=cos-exec --label=@deep
```

One rule remains, and it is the highest-leverage convention in the whole system: every title names a concrete action. It gets its own guide — [Concrete actions only](/guides/concrete-actions-only).

## See it

The [demo vault](/demo/vault/dot-beads/issues.jsonl) has a task graph after two weeks of real use. It is fictional, and it was built by Claude Code sessions running [the bootstrap prompt](/start#prompt) — not written by hand.