1 Three jobs

Status

What's in flight, open, stuck, and done, at the scope you asked for. Statuses in the wild are messy; the survey keeps every raw value and adds a lifecycle bucket.

Cleanup

The empty skeletons, the stale stubs, the docs whose checkboxes are all ticked but whose status still says Draft, the missing type and the statuses that fit nothing. Listed, never edited: you clean up on purpose.

Thinking like a CTO

Which repos are moving, by commits and agent-assisted share. Which specs are signed off with nobody building them, which need a decision, which issues are ready to hand to someone.

2 Three views, three modes

One self-contained HTML page per view: it opens from disk, works offline, and switches between light, dark, and vibrant. Every doc has a copy path button, so you can hand it straight to an agent: "work on this one." These are real surveys of our own tree, as of late October 2026.

Board view of a whole tree of public repos in dark mode: a stat strip, then Open, In flight, Done and Parked columns of doc cards beside a rail of unchecked checkbox items with line numbers

Board

What should I work on?

Columns by lifecycle: open, in flight, recently done, parked. Beside them, every unchecked checkbox in a live plan or spec, with its line number.

Ledger view in dark mode: totals of 651 docs across 36 repos with context-v, then a repo-by-lifecycle matrix whose amber-shaded cells show where open, in-flight and done docs pile up

Ledger

Where is the work piling up?

A repo × lifecycle matrix, shaded by volume; every cell clicks through to its docs. Below it, the health panel and a filterable table of every doc.

Map

Where does the thinking live?

The tree itself: repos nested as they sit on disk, each with a status-mix bar and a freshness strip. Search opens a match's parents.

The whole-tree examples cover about a hundred repos and a thousand docs. Links in them point at files on our own laptop; the copy-path buttons still work.

3 Scopes

Scope comes from where you run it, plus one flag. A repo is any folder with a .git, so submodules count, and each context-v/ belongs to the nearest repo above it.

  1. --scope repo Repo

    One repo's context-v/, child repos left out. A status page for one project.

  2. --scope tree Tree

    A repo and every repo below it. Run at the top of a tree of repos, it is the global view.

  3. --scope lineage Lineage

    A repo and every repo above it: what the parents decided that governs this one.

  4. --repos a,b,c Pick

    Just the repos you name: the handful relevant to today's work.

4 Run it today

The survey will ship as /cv:survey. Until then it's three Python scripts on the kit's development branch, standard library only:

From a clone of the kit

  1. Scan. Writes survey.json to context-v/extra/survey/, which the practice already gitignores.

    python3 agent-skills/survey/scripts/scan.py ~/code/your-repo
  2. SURVEY.md: the same picture, sized for an agent to read.

    python3 agent-skills/survey/scripts/report.py <that survey.json>
  3. The Board page. spike_ledger.py and spike_map.py make the other two.

    python3 agent-skills/survey/scripts/spike_board.py <that survey.json>

Useful flags

--scope and --repos pick the scope. --no-git skips commit history (faster; no momentum). --public drops private docs and absolute paths, for a page you'll publish.

Read the spec or the source. The three pages are spikes, being merged into one.