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.
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.