Gallery › Vibe Tracks › Vibe Tracks feature tree

Vibe Tracks feature tree

Vibe Tracks' own spec: each feature note under its area, the tests that prove it under the feature, and every state computed from the latest runs (pass, fail, not run yet, no tests), a failure rolling up to the track. An outline that folds, a "Failing" preset, a table of features by note status, and a page per node.

Vibe Trackslisttablerecord4 views of one spec-tree.json

The .base file and its data

Every tab above is one entry of this file; the views read these rows. ⋯ in the toolbar copies the current view as YAML.

# Vibe Tracks' feature tree: the Spec tab's tree (vibetracks~/spec.js, VT.ui.specTree) over its own
# computed spec, vt-spec-tree/1, as rows. Obsidian Bases grammar plus data-ui's keys (docs/CONTRACT.md §5).
data: spec-tree.json
facets:
  - state
  - kind
  - status
views:
  - type: list
    name: Spec tree
    tree: { parent: parent }
    order: [title, state, tests, status]
    markers: none
    separator: "  "
  - type: list
    name: Failing
    filters: 'state == "fail"'
    tree: { parent: parent }
    order: [title, tests, message, file]
    markers: none
    indentProperties: true
  - type: table
    name: Features
    filters: 'kind == "feature"'
    order: [title, feature, state, tests, priority, also]
    groupBy: { property: status }
    sort:
      - { property: feature, direction: ASC }
  - type: record
    name: Node
    filters: 'kind != "check"'
    record:
      sections:
        - { name: Intent, properties: [kind, feature, status, priority, description] }
        - { name: Results, properties: [state, tests, last_run, sha, also] }
// spec-tree.json: 133 rows, 84 KB; the first 3
{
 "id": "vibetracks-spec-tree",
 "title": "Vibe Tracks feature tree",
 "titleProperty": "title",
 "source": "vibetracks spec tree (vt-spec-tree/1) at 2694a97af069, generated 2026-10-26T00:15:19-07:00; areas area:sidebar, area:home, area:review, area:track-page",
 "properties": {
  "title": {
   "type": "text",
   "label": "Node"
  },
  "parent": {
   "type": "text",
   "label": "Parent",
   "hidden": true
  },
  "kind": {
   "type": "text",
   "label": "Kind",
   "display": "badge",
   "colors": {
    "track": 7,
    "area": 1,
    "feature": 3,
    "check": 0
   }
  },
  "name": {
   "type": "text",
   "label": "Test"
  },
  "feature": {
   "type": "text",
   "label": "Feature id"
  },
  "state": {
   "type": "text",
   "label": "State",
   "display": "badge",
   "colors": {
    "pass": 6,
    "fail": 8,
    "notrun": 4,
    "notests": 0
   },
   "labels": {
    "pass": "pass",
    "fail": "fail",
    "notrun": "not run yet",
    "notests": "no tests"
   },
   "note": "computed from each suite's latest run; a failure rolls up to every ancestor"
  },
  "tests": {
   "type": "text",
   "label": "Passed / total",
   "align": "right"
  },
  "passed": {
   "type": "number",
   "label": "Passed",
   "hidden": true
  },
  "total": {
   "type": "number",
   "label": "Tests",
   "hidden": true
  },
  "status": {
   "type": "text",
   "label": "Note status",
   "display": "badge",
   "colors": {
    "done": 3,
    "review": 5,
    "running": 1,
    "waiting": 4,
    "ready": 7,
    "todo": 0,
    "backlog": 0,
    "archived": 0
   },
   "note": "the feature note's vibe-status, as written"
  },
  "priority": {
   "type": "text",
   "label": "Priority"
  },
  "description": {
   "type": "text",
   "label": "Description"
  },
  "suite": {
   "type": "text",
   "label": "Suite"
  },
  "file": {
   "type": "text",
   "label": "File"
  },
  "message": {
   "type": "text",
   "label": "Failure"
  },
  "stale": {
   "type": "boolean",
   "label": "Ran before the latest change"
  },
  "last_run": {
   "type": "date",
   "label": "Last run"
  },
  "sha": {
   "type": "text",
   "label": "Commit"
  },
  "also": {
   "type": "list",
   "label": "Also under"
  }
 },
 "rows": [
  {
   "id": "track",
   "parent": null,
   "kind": "track",
   "title": "Vibe Tracks",
   "name": null,
   "feature": null,
   "state": "fail",
   "passed": 1203,
   "total": 1216,
   "tests": "1203/1216",
   "status": null,
   "priority": null,
   "description": "the whole track: 14 areas; 4 of them below",
   "suite": null,
   "file": null,
   "message": null,
   "stale": null,
   "last_run": null,
   "sha": "2694a97",
   "also": null
  },
  {
   "id": "track/area:sidebar",
   "parent": "track",
   "kind": "area",
   "title": "Sidebar",
   "name": null,
   "feature": null,
   "state": "pass",
   "passed": 41,
   "total": 41,
   "tests": "41/41",
   "status": null,
   "priority": null,
   "description": null,
   "suite": null,
   "file": null,
   "message": null,
   "stale": null,
   "last_run": "2026-10-20",
   "sha": "f4c0024",
   "also": null
  },
  {
   "id": "track/area:sidebar/feature:VT-009",
   "parent": "track/area:sidebar",
   "kind": "feature",
   "title": "Sidebar in Claude Code's visual language",
   "name": null,
   "feature": "VT-009",
   "state": "pass",
   "passed": 16,
   "total": 16,
   "tests": "16/16",
   "status": "done",
   "priority": "high",
   "description": "Claude Desktop's own sidebar CSS: 26 px rows, the status dots and blink, project headers, account bottom-left, phone drawer.",
   "suite": null,
   "file": null,
   "message": null,
   "stale": null,
   "last_run": "2026-10-20",
   "sha": "f4c0024",
   "also": [
    "Renderer"
   ]
  }
 ]
}
README.md
# Vibe Tracks feature tree

Vibe Tracks' own spec: each feature note under its area, the tests that prove it under the feature, and every state
computed from the latest runs (pass, fail, not run yet, no tests), a failure rolling up to the track. An outline that
folds, a "Failing" preset, a table of features by note status, and a page per node.

- **App:** Vibe Tracks
- **Replaces:** the Spec tab's hand-rolled tree in Vibe Tracks, `VT.ui.specTree` in
  `vibetracks~/spec.js` in `~/vibetracks` (story: `SpecTree.stories.js`;
  docs/peps/0007 "the feature tree"). Vibe Tracks keeps computing the tree (`vt spec tree`) and running the suites;
  drawing it, folding it, filtering it and the side peek are the kit's.
- **Shows:** `type: list` with `tree: {parent}` (area -> feature -> test), state badges coloured by slot, a filter
  that keeps a failure's whole path (states roll up, so every ancestor of a failing test is failing too), a grouped
  table and `type: record` over the same rows; the rail filters every view by state, kind and note status.
- **Data:** `spec-tree.json`, 133 rows from four of the track's areas (Sidebar, Home, Review, Track page), written by
  `source/make.py`, which runs Vibe Tracks' read-only `python3 -m vibetracks spec tree` in `~/vibetracks` and
  flattens it. Counts and states are the tree's own; the track row's 1203/1216 covers all of its areas, not only
  these four. Vibe Tracks is a public repo: feature notes and test names, no private track figures.

The original UI it replaces

the Spec tab's hand-rolled tree in Vibe Tracks, VT.ui.specTree in vibetracks~/spec.js in ~/vibetracks (story: SpecTree.stories.js; docs/peps/0007 "the feature tree"). Vibe Tracks keeps computing the tree (vt spec tree) and running the suites; drawing it, folding it, filtering it and the side peek are the kit's.

What it shows

type: list with tree: {parent} (area -> feature -> test), state badges coloured by slot, a filter that keeps a failure's whole path (states roll up, so every ancestor of a failing test is failing too), a grouped table and type: record over the same rows; the rail filters every view by state, kind and note status.

Data

spec-tree.json, 133 rows from four of the track's areas (Sidebar, Home, Review, Track page), written by source/make.py, which runs Vibe Tracks' read-only python3 -m vibetracks spec tree in ~/vibetracks and flattens it. Counts and states are the tree's own; the track row's 1203/1216 covers all of its areas, not only these four. Vibe Tracks is a public repo: feature notes and test names, no private track figures.