Examples › design work › Brand lineage

Brand lineage

Every logo and brand proposal from Brandbook's four brands as one table of rows, drawn as a tree of life: x is the round, each proposal hangs off the one it came from, a splice's extra parents curve in dashed, robotparts' shipped logo (R16-02) and its ancestors are the bold trunk, and the lines Zach never picked or liked thin out or fold into "+N". Click a mark for its record, its round's reply and where its report lives; the rail's brand, status and score filters thin the tree like any view.

design worklineagetable5 views of one proposals.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.

# Every brand proposal Zach has been shown, as rows, and the lineage view's tree of life over them: x is the round,
# each proposal hangs off the one it was derived from, a splice draws its extra parents dashed, the shipped pick's
# ancestry is the bold trunk and the lines nobody kept fold into "+N".
# Obsidian Bases grammar plus data-ui's keys (docs/CONTRACT.md §5, §21 for lineage:).
# Check it: node bin/data-ui.mjs check <this file> --data proposals.json
data: proposals.json
facets:
  - brand
  - status
  - round_kind
  - { property: score, as: range }
  - { property: name, as: search }
views:
  - type: lineage
    name: robotparts
    filters: 'brand == "robotparts"'
    order: [name, round, status, score, note]
    lineage:
      parents: parents
      x: round_n
      xLabel: round
      image: thumb
      label: name
      focus: robotparts/r16-02
      kept: { status: [picked, liked] }
      extinct: collapse
      layout: rectangular
  - type: lineage
    name: robotparts radial
    filters: 'brand == "robotparts"'
    order: [name, round, status, score, note]
    lineage:
      parents: parents
      x: round_n
      xLabel: round
      image: thumb
      label: name
      focus: robotparts/r16-02
      kept: { status: [picked, liked] }
      extinct: show
      layout: radial
  - type: lineage
    name: BAM
    filters: 'brand == "BAM"'
    order: [name, round, status, note]
    lineage:
      parents: parents
      x: round_n
      xLabel: round
      image: thumb
      label: name
      focus: bam/final-01
      kept: { status: [picked, liked] }
      extinct: collapse
  - type: lineage
    name: Every brand
    order: [name, brand, round, status, score, note]
    lineage:
      parents: parents
      x: round_n
      image: thumb
      label: name
      focus: robotparts/r16-02
      kept: { status: [picked, liked] }
      extinct: show
  - type: table
    name: Table
    order: [thumb, name, brand, round, status, score, parents, note, report_path]
    display: { thumb: image }
    sort:
      - { property: brand, direction: ASC }
      - { property: round_n, direction: ASC }
// proposals.json: 319 rows, 286 KB; the first 3
{
 "id": "brand-lineage",
 "title": "Brand proposals and where each came from",
 "titleProperty": "name",
 "imageProperty": "thumb",
 "source": "brandbook src/data/brands.json, generated 2026-10-27T06:51:12+00:00 (tools/extract_lineage.py; evidence in tools/lineage-notes.md)",
 "properties": {
  "name": {
   "type": "text",
   "width": 220
  },
  "brand": {
   "type": "text",
   "width": 100
  },
  "round": {
   "type": "text",
   "width": 70,
   "note": "R<n> in the brand's own round order; Final = the shipped files"
  },
  "round_n": {
   "type": "number",
   "width": 70,
   "note": "the round's position in its brand, 1 = the first"
  },
  "round_title": {
   "type": "text",
   "width": 220
  },
  "round_kind": {
   "type": "text",
   "width": 80,
   "display": "badge",
   "note": "explore = fresh directions; vary = variants of one parent; splice = parts of two or more; polish = steps on the pick; final = the shipped files"
  },
  "proposal": {
   "type": "text",
   "width": 70,
   "note": "the id Zach used in that round's report"
  },
  "status": {
   "type": "text",
   "width": 80,
   "display": "badge",
   "colors": {
    "picked": 1,
    "liked": 2,
    "rejected": 0,
    "neutral": 0
   },
   "note": "from Zach's replies; rejected only when he said so"
  },
  "score": {
   "type": "number",
   "width": 70
  },
  "score_max": {
   "type": "number",
   "width": 70
  },
  "parents": {
   "type": "list",
   "width": 220,
   "relation": true,
   "note": "the proposals this one was derived from (Brandbook's lineage rule); two or more = a splice"
  },
  "splice": {
   "type": "boolean",
   "width": 60
  },
  "thumb": {
   "type": "text",
   "width": 80,
   "display": "image",
   "media": true
  },
  "note": {
   "type": "text",
   "width": 320
  },
  "reply": {
   "type": "text",
   "width": 320,
   "note": "Zach's reply to the round, verbatim"
  },
  "report_path": {
   "type": "text",
   "width": 260,
   "note": "where the round's HTML report lives on Zach's machine (plain text: a file path is not a link on the published site)"
  },
  "date": {
   "type": "date",
   "width": 100
  },
  "final_pick": {
   "type": "boolean",
   "width": 60
  }
 },
 "rows": [
  {
   "id": "robotparts/r1-01",
   "name": "Exploded black box",
   "brand": "robotparts",
   "round": "R1",
   "round_n": 1,
   "round_title": "Round 1 · 20 directions",
   "round_kind": "explore",
   "proposal": "01",
   "status": "neutral",
   "score": {
    "value": null,
    "why": "this round was not scored"
   },
   "score_max": null,
   "parents": [],
   "splice": false,
   "thumb": "thumbs/robotparts/r1-01.png",
   "note": "A box with its lid lifted on dashed guide lines: the part is a black box you can still look into (specs, CAD, sim, prices).",
   "reply": "Go the logo I kinda like this idea of modularity... as its all about building big robots from small parts... \n\nKinda similar to like BAM robtics actually... please check thoose logos for a bit on isnpiration...\n\nFeels a bit like ceelurar automata\n\nTHe pixel grid is cool for that reason...\n\nBut look at BAM as we where kinda expressing similar things...\n\nThis is c a cool idea as well maybne parts is like in a tool box: \n\nOr like Parts looks like a lego block",
   "report_path": "~/robotparts/reports/media/robotparts-logos-2026-10-25.html",
   "date": "2026-10-25",
   "final_pick": false
  },
  {
   "id": "robotparts/r1-02",
   "name": "Isometric cube with a port",
   "brand": "robotparts",
   "round": "R1",
   "round_n": 1,
   "round_title": "Round 1 · 20 directions",
   "round_kind": "explore",
   "proposal": "02",
   "status": "liked",
   "score": {
    "value": null,
    "why": "this round was not scored"
   },
   "score_max": null,
   "parents": [],
   "splice": false,
   "thumb": "thumbs/robotparts/r1-02.png",
   "note": "One solid isometric block with a single connector port cut into its face; the catalog's unit of thought is the part-as-box.",
   "reply": "Go the logo I kinda like this idea of modularity... as its all about building big robots from small parts... \n\nKinda similar to like BAM robtics actually... please check thoose logos for a bit on isnpiration...\n\nFeels a bit like ceelurar automata\n\nTHe pixel grid is cool for that reason...\n\nBut look at BAM as we where kinda expressing similar things...\n\nThis is c a cool idea as well maybne parts is like in a tool box: \n\nOr like Parts looks like a lego block",
   "report_path": "~/robotparts/reports/media/robotparts-logos-2026-10-25.html",
   "date": "2026-10-25",
   "final_pick": false
  },
  {
   "id": "robotparts/r1-03",
   "name": "Gear inside a box",
   "brand": "robotparts",
   "round": "R1",
   "round_n": 1,
   "round_title": "Round 1 · 20 directions",
   "round_kind": "explore",
   "proposal": "03",
   "status": "neutral",
   "score": {
    "value": null,
    "why": "this round was not scored"
   },
   "score_max": null,
   "parents": [],
   "splice": false,
   "thumb": "thumbs/robotparts/r1-03.png",
   "note": "A gear sealed inside a square outline: mechanism visible, packaging opaque. The literal reading of 'black box'.",
   "reply": "Go the logo I kinda like this idea of modularity... as its all about building big robots from small parts... \n\nKinda similar to like BAM robtics actually... please check thoose logos for a bit on isnpiration...\n\nFeels a bit like ceelurar automata\n\nTHe pixel grid is cool for that reason...\n\nBut look at BAM as we where kinda expressing similar things...\n\nThis is c a cool idea as well maybne parts is like in a tool box: \n\nOr like Parts looks like a lego block",
   "report_path": "~/robotparts/reports/media/robotparts-logos-2026-10-25.html",
   "date": "2026-10-25",
   "final_pick": false
  }
 ]
}
skin.css, README.md
/* The marks are one dark ink drawn for paper (Brandbook's thumbs: the light mark on transparent), so a node's image
   well stays paper-white in both themes, as the logo-rounds case keeps its wells; in a dark theme a dark well would
   make the marks vanish. */
.data-ui-skin .dv-lineage-well { fill: #ffffff; }
.data-ui-skin .dv-lineage-step img { background: #ffffff; }
# Brand lineage

Every logo and brand proposal from Brandbook's four brands as one table of rows, drawn as a tree of life: x is the
round, each proposal hangs off the one it came from, a splice's extra parents curve in dashed, robotparts' shipped
logo (R16-02) and its ancestors are the bold trunk, and the lines Zach never picked or liked thin out or fold into
"+N". Click a mark for its record, its round's reply and where its report lives; the rail's brand, status and score filters thin
the tree like any view.

- **App:** design work
- **Replaces:** Brandbook's hand-built phylogeny prototype (`~/brandbook/src/variants/v3-phylogeny/`, React +
  d3-hierarchy over one brand at a time) and the per-round logo galleries it links to.
- **Shows:** `type: lineage` (docs/CONTRACT.md §21): `lineage.parents` as the only source of edges, `x: round_n` as
  the ordinal axis with `xLabel`, image nodes from `thumb`, `focus` and its trunk, `kept: {status: [picked, liked]}`
  with `extinct: collapse` (the robotparts tab) and `extinct: show`, the rectangular and radial layouts, the path panel
  (resizable, remembered, folds), and the relation links in the peek (`parents` is `relation: true`).
- **Data:** `proposals.json` and `thumbs/`, written by `source/make.py` from Brandbook's `src/data/brands.json`
  (read-only; parents per its `src/lib/lineage.ts` rule, every claim's evidence in `tools/lineage-notes.md`). 319
  proposals: robotparts 205 over 18 rounds, ObjectDB 51 over 3, BAM 53 over 4, Jidoka 10. Gaps, as the extraction
  records them: robotparts round 1 and BAM's rounds are unscored ("—" with the reason); the two finals have no HTML
  report; `report_path` is the report's path on Zach's machine as plain text (never a link on the published site).

The original UI it replaces

Brandbook's hand-built phylogeny prototype (~/brandbook/src/variants/v3-phylogeny/, React + d3-hierarchy over one brand at a time) and the per-round logo galleries it links to.

What it shows

type: lineage (docs/CONTRACT.md §21): lineage.parents as the only source of edges, x: round_n as the ordinal axis with xLabel, image nodes from thumb, focus and its trunk, kept: {status: [picked, liked]} with extinct: collapse (the robotparts tab) and extinct: show, the rectangular and radial layouts, the path panel (resizable, remembered, folds), and the relation links in the peek (parents is relation: true).

Data

proposals.json and thumbs/, written by source/make.py from Brandbook's src/data/brands.json (read-only; parents per its src/lib/lineage.ts rule, every claim's evidence in tools/lineage-notes.md). 319 proposals: robotparts 205 over 18 rounds, ObjectDB 51 over 3, BAM 53 over 4, Jidoka 10. Gaps, as the extraction records them: robotparts round 1 and BAM's rounds are unscored ("—" with the reason); the two finals have no HTML report; report_path is the report's path on Zach's machine as plain text (never a link on the published site).