Skip to content

bob task

Vault-wide task maintenance: archive, move, reconcile, reroll

bob task --help
Vault-wide task maintenance: archive, move, reconcile, reroll

Every `bob task` command rewrites task lines across the whole vault.

Usage: bob task <COMMAND>

Commands:
  archive    Move done and canceled tasks into done/ archives and repair links
  move       Move open tasks between notes and repair vault links
  reconcile  Reconcile task statuses from the Pomodoro ledger and dependencies
  reroll     Re-roll due prioritized tasks within their priority windows

Options:
  -h, --help  Print help

Examples:
  bob task archive               Archive done and canceled tasks
  bob task move --dry-run        Preview moving tasks and repairing links
  bob task reconcile --dry-run   Preview task status reconciliation
  bob task reroll --dry-run      Preview re-rolling due prioritized tasks

See also: bob plan, bob ready, bob freshness, bob projects, bob query
Run 'bob task <command> --help' for more information on a command.

bob task archive

Move done and canceled tasks into done/ archives and repair links

bob task archive --help
usage: bob task archive [-t|--threshold N]

Move done and canceled Bob task blocks into archive notes, link sources,
repair archive metadata, and repair Obsidian links to moved block ids.

example:
  bob task archive --threshold 10

options:
  -h, --help       show this help message and exit
  -t, --threshold N
                   minimum completed/canceled task count per source note (default: 10)

bob task move

Move open tasks between notes and repair vault links

bob task move --help
Move selected open task blocks to another eligible note, preserving task state while repairing block links and dependency identities throughout the vault.

A live run holds the shared maintenance lock, syncs before and after the move, and commits exactly the changed Markdown files. Use --dry-run to inspect the same plan without locking, syncing, probing Git, or writing. Use --offline to skip both sync cycles while keeping the lock and scoped local commit.

Usage: bob task move [OPTIONS] <--block <ID>|--match <TEXT>> <SOURCE> <DEST>

Arguments:
  <SOURCE>
          Source note stem or vault-relative path

  <DEST>
          Destination note stem or vault-relative path

Options:
  -b, --block <ID>
          Select a task by trailing block id without ^; repeatable

  -d, --dry-run
          Plan and print only; do not lock, sync, probe Git, or write

  -f, --format <FORMAT>
          Output format: human or json

          [default: human]
          [possible values: human, json]

  -h, --help
          Show help

  -m, --match <TEXT>
          Select the task whose line contains this literal text; repeatable

  -o, --offline
          Skip both sync cycles; commit locally without pushing

  -r, --retry-timeout <SECONDS>
          Lock wait and re-plan budget after concurrent edits; 0 fails fast

          [default: 60]

Examples:
  bob task move --dry-run old-note new-note -b work-item
                                 Preview a move selected by block id
  bob task move old-note new-note -m 'Prepare release'
                                 Move a task selected by literal line text
  bob task move -d -f json old-note new-note -b work-item
                                 Print a machine-readable preview

Run 'bob task reconcile' after a move when the report says
reconciliation is pending.

bob task reconcile

Reconcile task statuses from the Pomodoro ledger and dependencies

bob task reconcile --help
Make the current Pomodoro ledger the source of truth for active task statuses and use the latest existing earlier daily note as a read-only recent-activity source.

Tasks block-linked from child bullets of open Pomodoro entries have a minimum desired status of Next [*]; tasks already In Progress [/] keep that stronger status. Dependency tasks are discovered recursively from Depends-On line links plus R8 legacy dependency children (see docs/task-dependencies.md) and inherit the strongest effective parent status, promoting Ready [ ] tasks to Next or In Progress and Next tasks to In Progress. Depends-On lines are reconciled into [dependsOn::] / [id::] fields first (R1-R10: project, adopt, heal, canonicalize, warn), and human and JSON reports include the dependency projection counts. Status propagation never lowers a task, and removing a link never changes a lane: unlinked Next [*] and In Progress [/] tasks stay as they are. Only a daily-note Next task still clears: a [*] that lives in a canonical daily note or the selected current ledger and is not reachable from an open entry is reset to [ ], unless it is directly referenced by recent activity, in which case it is kept. Historical links supply recovery-only rank for Blocked tasks without promoting Ready tasks; a recovered directly referenced Next task stays Next while it remains recent, and the historical note is never modified. Tasks whose Dataview [dependsOn:: ...] metadata names an open vault-wide [id:: ...] task, or whose task-level [scheduled:: YYYY-MM-DD] date is later than the effective daily anchor, are marked Blocked [?], overriding Ready, Next, and In Progress. A schedule on the anchor date or earlier is not future. When every derived blocking reason clears, Blocked tasks recover to Next when directly recent, In Progress only through a stronger eligible transclusion path, or Ready when unreachable. No pre-Blocked status is stored. Blocking starts from an open project's `^prj` Depends-On line and inline schedule, and cascades through project `parent:` links. Descendant `^prj` tasks inherit ancestor reasons and carry `#prj_is_blocked`; every open resident of a blocked project carries the same tag, and every automatic Blocked-to-Ready recovery writes `[unblocked::]` (see docs/task-dependencies.md §13). Completed linked-task references are retired as struck, non-embedded links. References found under open Pomodoros keep the existing policy of moving their containing bullets beneath the current timed Pomodoro, or the last completed Pomodoro when there is no current one. A link to an unambiguously cancelled Tasks task removes its complete Markdown list-item subtree from an open Pomodoro, including for custom single-character statuses whose Tasks type is CANCELLED; the cancelled task status itself is left unchanged. A live Task Link to an effectively Blocked task under today's open Pomodoros is consumed: it seeds promotion along the task's dependency edges, then the link is removed (a link-only bullet with its subtree; otherwise only the token). After duplicate, canceled, blocked-link consumption, completed-reference, and marker repairs are composed, childless open or completed Pomodoro entries in the current daily ledger are removed with their full entry blocks. Done, cancelled, non-task, and unknown task statuses are never transitioned.

When the same resolved task is linked beneath multiple open Pomodoros, the first open Pomodoro in file order keeps ownership and every conflicting physical line beneath later open Pomodoros is removed in full. Aliases, embeds, same-note links, and alternate note spellings compare by resolved vault-relative path plus block ID. Repeats within one owning Pomodoro are preserved, as are unresolved links and links beneath completed or cancelled Pomodoros. If a block ID matches multiple task lines, canceled-reference list-item removal requires every match to have a recognized CANCELLED status.

After final checkbox and daily structural changes are composed, eligible area/project Tasks sections are grouped into generated child headings: Next & In Progress, Blocked, and Done & Canceled. Ready [ ] tasks and introductory prose stay in the unheaded intake where ordinary capture adds new tasks. Decorated containers carry a linked status-count badge row, authored topic headings keep their local context, generated groups exist only while they hold a task, and unsupported containers are warned and left unchanged. Grouping excludes daily notes, the selected previous daily, ordinary notes, archives, generated notes, and templates.

Only Markdown checkbox lines allowed by the Obsidian Tasks globalFilter are considered. The scan skips hidden directories, templates, generated notes, and done archives. Blocked writes require exactly one compatible Tasks status named Blocked with symbol [?], type ON_HOLD, and next status Ready. Missing current daily notes and current daily notes without a Pomodoros section, as well as current notes with multiple non-empty open timed Pomodoros, fail before any file is changed. No earlier daily note is valid; an earlier note without a Pomodoros section contributes no historical references. Live writes use guarded snapshots, recovery copies, and a bounded quiet-period check for structural regrouping. Dry-run computes the same grouping preview without locking, waiting, staging, writing notes, or creating recovery records.

Usage: bob task reconcile [OPTIONS]

Options:
  -b, --bob-dir <DIR>
          Bob vault root; defaults to BOB_DIR or ~/bob

  -d, --dry-run
          Compute and report the sync without writing notes

  -f, --format <FORMAT>
          Output format: human or json

          [default: human]
          [possible values: human, json]

  -h, --help
          Show help

  -r, --retry-timeout <SECONDS>
          Retry recoverable failures (lock contention, a changed vault, an unstable read) for up to this many seconds with jittered backoff; 0 attempts once and fails fast

          [default: 120]

Examples:
  bob task reconcile
  bob task reconcile --dry-run
  bob task reconcile --format json
  bob task reconcile --bob-dir /tmp/bob-vault
  bob task reconcile --retry-timeout 0
  bob task reconcile --retry-timeout 300

Environment:
  BOB_DAY_FILE  exact current daily ledger; its dated filename anchors earlier-note lookup and future schedules
  BOB_DIR       Bob vault root when --bob-dir is omitted
  BOB_NOW       current date/time fallback for current and earlier-note selection

bob task reroll

Re-roll due prioritized tasks within their priority windows

bob task reroll --help
Re-schedule every due prioritized task to an independent random date inside that task's own priority window from the Bob config.

A task qualifies when it is an open Ready or Blocked task with exactly one `priority` field naming a configured level and exactly one strict `YYYY-MM-DD` `scheduled` date on or before the cutoff. Each re-roll replaces the scheduled date, flips a future-dated Ready task to Blocked, and writes a 🎲 Schedule Log entry; eligible project notes are regrouped in the same write.

P0 tasks, Next and In Progress tasks, tasks linked from today's open Pomodoros, and tasks with `due` or `repeat` dates are always left alone, as are tasks owned by `bob projects sync` (`^prj`).

A live run holds the shared vault-maintenance lock while it syncs, plans, writes, commits exactly the rewritten notes as one `bob task reroll` commit, and syncs again. Undo a run with `git -C ~/bob revert <sha> && bob vault-sync`; re-running with the printed seed replays the same dates.

Usage: bob task reroll [OPTIONS]

Options:
  -d, --dry-run
          Preview the full plan without locking, syncing, or writing

  -f, --format <FORMAT>
          Output format: human or json

          [default: human]
          [possible values: human, json]

  -h, --help
          Show help

  -l, --level <LABEL>
          Only re-roll these configured labels; repeatable

  -o, --offline
          Skip both vault-sync cycles; commit locally without pushing

  -r, --retry-timeout <SECONDS>
          Budget for waiting on the maintenance lock and for re-planning after concurrent-edit races; 0 fails fast

          [default: 60]

  -s, --seed <SEED>
          Base seed, decimal or 0x-hex; a dry run prints the seed that reproduces its dates

  -u, --until <DATE|+N>
          Treat tasks scheduled through DATE (or N days from today) as due and roll their windows from that date

Examples:
  bob task reroll --dry-run
                                 Preview what would move and where
  bob task reroll --seed 0x7f3a91c2
                                 Apply the dates a dry run showed
  bob task reroll --level P2 --level P3
                                 Leave P1 tasks for hand triage
  bob task reroll --until +7
                                 Clear a week for P0 work
  bob task reroll --dry-run --format json
                                 Machine-readable preview

Environment:
  BOB_CONFIG_FILE  priority-window config; defaults to ~/.config/bob/config.yml
  BOB_DAY_FILE  exact current daily ledger; its dated filename anchors the effective day
  BOB_DIR       Bob vault root
  BOB_NOW       current date/time override for the effective day
  BOB_PRIORITY_ROLL_SEED  default base seed when --seed is omitted
  BOB_VAULT_SYNC_LOCK_FILE  shared vault-maintenance lock file
  BOB_VAULT_SYNC_STATE_FILE  vault-sync status record
  NO_COLOR      disable colored output
  XDG_CONFIG_HOME  config root when BOB_CONFIG_FILE is unset
  XDG_STATE_HOME  recovery-record root
Tested rolling snapshot bob-cli 41afa14 bob-mac-capture 556bb67 bob-plugins af1e691 Built 2026-10-24T22:34:13Z (zensical) build.json