{
  "id": "r004",
  "title": "The altitude ladder: one book at five altitudes",
  "reviewer": "Dinis Cruz",
  "received": "22 August 2026",
  "source_kind": "voice memo (transcript preserved verbatim)",
  "source": "briefs/16__founder-review__altitude-ladder.md",
  "version_reviewed": "v0.3.14",
  "state": "commented",
  "state_note": "Commented, and the central item is built rather than proposed: this memo asks for an experiment, and an experiment that is only described has not been run. The ladder is live at /altitudes/ with levels 1 to 3 complete, level 4 for two chapters, the graph layer lifted on those paths, and five findings from the climb. No book content changed: the ladder is a new artefact beside the book, not an edit to it. Three decisions are open, and the first of them is whether the experiment earned a place in the pipeline at all. A second round on 22 August acted on the reviewer's UX feedback: the ladder is now resizable columns with per-level indexes (item 1's thread), the descent links carry a switchable colour meaning (item 7), and every level has its own ontology and taxonomy (item 8), which produced finding 7 — the classes do not survive the climb. Four decisions now open. A third round on the same day fixed the column flicker (item 1's thread) and added the graph view (item 9), which brought the site its first vendored dependency and decision D5 with it.",
  "decisions": [
    {
      "n": 1,
      "item": 1,
      "question": "Does the experiment continue? Three ways to take it: **stop** (the ladder stays as a published experiment, and the book carries on as it is); **finish the pilot** (take level 4 across all seventeen units, keeping the graph layer where it is); or **adopt** (the ladder becomes part of the build, authored in `content/altitudes/`, gate-checked like the book, with level 4 complete and the graph layer lifted everywhere). The agent recommends finishing the pilot first: the sharpest findings came from level 3 and the two drilled chapters, and the cost of the next twelve chapters is now measurable rather than guessed.",
      "options": [
        "Finish the pilot: level 4 for all seventeen units (recommended)",
        "Adopt into the build now",
        "Stop here, keep it as a published experiment"
      ],
      "state": "open"
    },
    {
      "n": 2,
      "item": 4,
      "question": "The findings need a home. Do repeats and contradictions become a **standing register** (a page like the reviews register, where each finding has a state and is closed by a release), or do they stay a **per-run output** of the ladder, regenerated and re-read each time? The agent recommends the standing register: a contradiction that is found, forgotten and re-found is not a finding, it is a treadmill.",
      "options": [
        "A standing register with states (recommended)",
        "A per-run output only"
      ],
      "state": "open"
    },
    {
      "n": 3,
      "item": 5,
      "question": "Which audience variant is worth building first, once the ladder is stable: a **business** projection of level 2, a **graph-literate** projection of level 3, or a **non-English** projection of level 2 (the translation case, which tests whether the graph really is what survives)? Each is one re-projection from the same graph, not a new book.",
      "options": [
        "Business, from level 2",
        "Graph-literate, from level 3",
        "A non-English projection of level 2",
        "None yet: stabilise the ladder first"
      ],
      "state": "open"
    },
    {
      "n": 4,
      "item": 8,
      "question": "The per-level ontologies and taxonomies are authored by the agent and are a first pass: the classes are defensible but not confirmed, and the author is the oracle for a classification of their own book. Confirm them, or correct the classes that are wrong? The most arguable calls: chapter 4 (the edge set) is classed **Prescription** rather than Apparatus; the Introduction is classed **Argument** rather than Signpost; and level 4's class vocabulary is about what a section does to the reader, which is a different kind of scheme from every level above it.",
      "options": [
        "Confirm as authored",
        "Correct specific classes (say which)",
        "Rework the class vocabulary at a level"
      ],
      "state": "open"
    },
    {
      "n": 5,
      "item": 9,
      "question": "This site now carries its **first vendored third-party dependency** (Cytoscape.js 3.30.2, MIT, 373 KB, committed at /assets/vendor/). Everything else here is hand-written with no runtime dependencies, and that has been a stated property. Keep it (a real graph library earns its place for a real graph), replace it with a hand-written layout to preserve the no-dependency claim, or keep it and state the exception explicitly in the engineering page and chapter 12's honesty table?",
      "options": [
        "Keep it, and state the exception in the honesty table (recommended)",
        "Keep it, no further statement",
        "Replace with a hand-written layout"
      ],
      "state": "open"
    }
  ],
  "items": [
    {
      "n": 1,
      "topic": "Build the ladder: five levels, each a compression of the one below",
      "reviewer_says": "Can we try to create five or seven versions of the book, which are all at different altitude? Let's say the current book is level five. The top level is almost a paragraph, like the executive summary, and each of the phrases hyperlinks to the next level, and then that has the same thing, all the way down. It needs to be from the bottom up: each layer is a compression of the previous layer that captures the core ideas.",
      "comment": "Built, because a described experiment is not an experiment. Five levels: the book (level 5, ~20,000 words), the sections (level 4), the seventeen units (level 3, 1,333 words), the six parts (level 2, 406 words), the book in one paragraph (level 1, 135 words). Built bottom-up as instructed, and that instruction turned out to be load-bearing rather than stylistic: writing level 1 first would have produced a marketing paragraph that the levels below could not have supported, and the discipline of only saying at a level what the level below actually contains is what generated every finding in item 4. One honest result to record: the pyramid is not monotonic per unit. Total words fall at every step, but a level 4 section digest is longer than that section's share of the level 3 chapter digest, because compression is per parent, not per descendant.",
      "proposal": "Coverage as the memo suggested: levels 1 to 3 complete, level 4 for two chapters (chapter 2, The five ideas, and chapter 5, Against schema-first, which is also r002's proposed graph pilot, so the two experiments share a chapter). The ladder is at **/altitudes/**, the data at /altitudes/data/altitudes.json, and every unit links down to level 5 in the book. Whether it goes further is decision D1.",
      "needs": [],
      "impact": [
        "new section (/altitudes/)",
        "new generator (gen_altitudes.py)",
        "no book content"
      ],
      "state": "applied",
      "applied_in": "v0.3.15",
      "thread": [
        {
          "date": "22 August 2026",
          "from": "Dinis Cruz, the reviewer",
          "note": "\"At the moment there doesn't seem to be a way to see and navigate all items in a layer. For example at the moment I need to go to L1 to see a particular L2 entry. But at least between layers we shouldn't change the layer page/section when clicking on entries: if I'm in L1 and click on the link, in the same page/UI the L2 content should appear on a side panel (resizable) so that it becomes really obvious the tree like structure.\"",
          "sources": []
        },
        {
          "date": "22 August 2026",
          "from": "the agent",
          "note": "Both fixed, and the second was the more serious of the two: replacing the view on every click made the ladder behave like a set of pages that happened to be numbered, which hid the very structure the experiment exists to show. The ladder is now **columns**: opening a unit appends a column beside the current one, the chain from level 1 down to a section stays on screen, columns are resizable by dragging the bar between them, and the columns container scrolls rather than the page. The address bar carries the whole trail (`?t=L1,L2-3,L3-5`), so a **path** is linkable, not just a node. For the first point, every column has an **index button listing all units at that level**, grouped by that level's taxonomy; picking one rebuilds the ancestor columns to its left, so entering at level 3 directly still shows what it sits inside. Level entry from the top rail opens that level's index in place.",
          "sources": []
        },
        {
          "date": "22 August 2026",
          "from": "Dinis Cruz, the reviewer",
          "note": "\"Fix the UX bug that when I have L1 and L2 open and I click on an L2 link on L1 text the screen doesn't move… now I click on an L3 link and there is a small animation as L3 opens up. But if I now click on another L3 link in L2 section I see the same animation which flicks the content and makes it hard to use.\"",
          "sources": []
        },
        {
          "date": "22 August 2026",
          "from": "the agent",
          "note": "Diagnosed and fixed. One cause, two symptoms: every click rebuilt the **entire** column strip and then smooth-scrolled it to the far end. Rebuilding threw away the scroll position, so the strip snapped to zero and animated back — which reads as a flicker when the column being opened was already on screen and nothing needed to move. Now only the columns to the right of the click are rebuilt (the ones to the left keep their DOM, their scroll and their open panels), the strip's scroll position is preserved across the rebuild, and it scrolls **only far enough** to bring a genuinely off-screen column into view. Where nothing needs to move, the changed column gives a short pulse instead: feedback without motion, which answers the first half of the report. The pulse respects `prefers-reduced-motion`.",
          "sources": []
        }
      ]
    },
    {
      "n": 2,
      "topic": "Keep the graph and the projection apart at every level",
      "reviewer_says": "There's already two concepts here. There's the concept of the graph, which has all the facts, the evidence, the structure, the points, the ideas, what you're trying to convey, and then there's the execution of that, which is the text itself, and the evidence and all the links. Each of these layers needs to have those graphs, and then needs to have the projection. Maybe you don't need to do the projection for all of them.",
      "comment": "Agreed and implemented, and it is the part of the memo that will matter longest: it separates what the book *knows* at a level from how that level *reads*. Each node carries a claims list with an evidence state (evidenced, argued, unevidenced) beside the text it supports, and the two are stored separately in the data. The unevidenced claims are rendered ghosted rather than hidden, which is r002 item 6's rule arriving early on cheaper ground.",
      "proposal": "The graph layer is lifted for levels 1 and 2 and for the two drilled chapters' paths. Where it was not lifted, the node says so explicitly, because an empty panel and an unbuilt one look identical otherwise. This is also the direct route into r002 item 3 (the book as a graph): the ladder's claim nodes are that graph, arriving one level up from the chapter text, and the pilot proves the shape before the full lift is attempted.",
      "needs": [],
      "impact": [
        "the ladder's data model",
        "r002 item 3's design"
      ],
      "state": "applied",
      "applied_in": "v0.3.15"
    },
    {
      "n": 3,
      "topic": "Many-to-many, not a clean tree",
      "reviewer_says": "There should be a tree-like structure of this as you go up and as the concepts merge, and of course they could be many-to-many relationships.",
      "comment": "The data model allows many-to-many in both directions (a phrase may compress several units; a unit may be compressed by several phrases), and the first real instance appeared immediately, which is finding 2: the Semantic Web's mistake is stated in chapter 1 and argued in full in chapter 5, so it should be compressed by both parts. The current level 2 assigns it to Part III alone. That is a choice the ladder forced and made visible, and the honest fix is a second parent rather than a tidier tree.",
      "proposal": "Keep the model many-to-many and let the exceptions accumulate before generalising: the pilot has one clear case and one candidate, which is not enough to design a merge rule. Recorded as an observation rather than a change, and revisited if D1 extends the pilot.",
      "needs": [],
      "impact": [
        "the ladder's data model"
      ],
      "state": "noted",
      "thread": [
        {
          "date": "22 August 2026",
          "from": "the agent",
          "note": "The column layout makes the many-to-many question visible rather than theoretical: a unit reached down two different paths now shows a different set of columns to its left, so the second parent this item predicted for the Semantic Web material (finding 2) would be observable as two trails ending at the same node. The trail currently reconstructs ancestors through the **first** parent only, which is honest for a pilot with one known case and would need a choice, not a default, once a second real case lands.",
          "sources": []
        }
      ]
    },
    {
      "n": 4,
      "topic": "The repeats and contradictions the climb was expected to surface",
      "reviewer_says": "In fact, it's interesting because I think with this we actually will find some repeated content and some contradictions in the content, which would be quite interesting. Once you look at all the facts, observations, hypotheses that a particular paragraph or section is doing, we should find contradictions with others, and then find a way to visualise.",
      "comment": "The prediction held, and this is the experiment's real result. Five findings, published on the ladder page. The one that justifies the whole exercise: at level 3, chapter 12's paragraph (no graph database, no browser SPARQL or Cypher, no RDF in the code) sits four units from chapter 7's (a SQLite interface, an RDF/Turtle export and a graph REPL). Both sentences are true, one about the codebase and one about a published vault, but on one page they read as a contradiction. That is precisely the correction the reviewer asked for in r001 item 5, **reached independently by compression rather than by being told**, which is the strongest evidence available that the method works. Alongside it: a signposted repeat that compression forces a decision about, a compression loss localised to a rung (five ideas from a source that lists ten principles), a weight mismatch that gives the title decision a concrete test, and one control case.",
      "proposal": "The visualisation the memo asks for, delivered as the findings section on the ladder page: each finding carries a kind, the units where it lives (linked, so a reader can climb straight to them), and a verdict. The control case is kept deliberately: a finding process that reported the already-disclosed relates-to contradiction as a discovery would be over-reporting, and showing that it does not is how the method earns trust. Where these findings live permanently is decision D2.",
      "needs": [],
      "impact": [
        "/altitudes/#findings",
        "r001 item 5 (gains independent evidence)",
        "r001 item 3 (dilution localised)"
      ],
      "state": "applied",
      "applied_in": "v0.3.15"
    },
    {
      "n": 5,
      "topic": "Translation, culture and stakeholder variants",
      "reviewer_says": "This is also very interesting when we then start looking at translations and adapt them to different cultures, or even adapting to different stakeholders, or different audiences: a more technical audience, a more business-like audience, a more graph knowledge audience.",
      "comment": "Agreed, and the ladder is the enabling structure rather than a side effect of it: the graph is what survives a change of audience, and the projection is what changes. A business edition is not a rewrite of 20,000 words, it is a re-projection of level 2 from the same claims with different examples; a translation is a re-projection rather than a re-translation, which is also the book's own concepts-not-words argument applied to itself. Worth stating the risk plainly: audience variants multiply the surface that can drift, and only the shared graph keeps them honest, so variants should not start before the graph layer is stable.",
      "proposal": "Not yet. One variant, after the ladder stabilises, chosen at decision D3, built as a second projection of an existing level so the claim can be tested cheaply: does the same graph really carry a different audience, or does the projection quietly change the argument? If it changes the argument, that is a finding about the graph, not about the translation.",
      "needs": [
        "The ladder stable (decision D1) before any variant is built."
      ],
      "impact": [
        "future editions",
        "translation strategy"
      ],
      "state": "proposed"
    },
    {
      "n": 6,
      "topic": "What the experiment says about the decoupling in r003",
      "reviewer_says": "This again, like this split means that there is a clean text now, which is the text of the book, which we version. (r003, carried forward: the book as the distilled best-of, with provenance back to the site.)",
      "comment": "The ladder is evidence for r003's architecture, arriving from an unexpected direction. Level 3 is, in effect, the distilled best-of that r003 describes: seventeen paragraphs that carry the argument without the evidence, each linking down to the full text. If the decoupling lands, the site holds the research estate at full granularity, the book holds the writing, and the ladder is the machinery that connects them, because compression with provenance is exactly what a distillation is. It also suggests the decoupled book's provenance blocks and the ladder's descent edges are the same edge type pointing at different targets.",
      "proposal": "Recorded as a connection rather than a change: r003's decision D1 does not need to wait for this, and if D1 adopts the decoupling, the ladder's descent edges should be built as the same mechanism as the provenance edges rather than a parallel one. Flagged so the two are designed once.",
      "needs": [],
      "impact": [
        "r003 item 1",
        "r003 item 2"
      ],
      "state": "noted"
    },
    {
      "n": 7,
      "topic": "Colour the descent links to mean something, switchably",
      "reviewer_says": "I really like those links to the next layer, but can you experiment with different colours (to represent different things).",
      "comment": "Worth doing, and the interesting part is that there is no single right answer: a descent link can usefully carry at least three different signals, and which one you want depends on why you are reading. Hard-coding one would have been a small act of schema-first.",
      "proposal": "Built as a **switch**, not a scheme: the same links colour by **the evidence behind the unit below** (green evidenced, amber argued, red unevidenced, grey where the graph layer was not lifted), by **how far it descends** (teal descends further, slate is a leaf in this pilot), or by **taxonomy class** (one hue per class, with a legend naming the class and its level). Same text, three graphs over it, chosen by the reader — which is the book's own render-the-query rule applied to its own navigation. The mode is in the URL, so a coloured view is shareable. An observation worth recording: the evidence mode is the one that changes how the page reads, because it makes the unevidenced stretches of the argument visible at a glance rather than on inspection.",
      "needs": [],
      "impact": [
        "/altitudes/",
        "possibly the chapter graphs of r002 item 6"
      ],
      "state": "applied",
      "applied_in": "v0.3.17"
    },
    {
      "n": 8,
      "topic": "An ontology and a taxonomy for every layer",
      "reviewer_says": "Finally can you experiment with the creation of an Ontology and Taxonomy for each layer.",
      "comment": "Done, and it stopped being bookkeeping about ten minutes in. Kept strictly apart in the way the book's own glossary keeps them apart: the taxonomy points upward (what kind of unit is this?), the ontology points outward (what types exist here and how may they connect?). Every edge type is a verb with a distinct inverse and a stated domain and range, because the grammar chapter demands that of any graph this project publishes, including this one.",
      "proposal": "Each level now carries both, in the data and in a panel on every column. The result is [finding 7](../altitudes/index.html#findings), and it is the most interesting thing this experiment has produced after the database contradiction: **the classes do not survive the climb.** A section classed *Rule* at level 4 sits inside a chapter classed *Prescription* at level 3, inside a part classed *Argument* at level 2, and nothing inherits. The vocabulary changes kind rather than granularity: at level 4 a unit is best described by what it does to the reader (definition, demonstration, rule, correction, signpost); at level 2 by what kind of matter it is (argument, evidence, disclosure, apparatus). At level 1 the taxonomy collapses, because a taxonomy of one unit is not a taxonomy, and inventing a second class to fill the shape would have been exactly the schema-first move this book argues against. Two consequences: it is an argument against a single book-wide ontology, and it is a warning for r002 item 3, whose graph pilot should expect node types to be level-dependent rather than universal.",
      "needs": [],
      "impact": [
        "/altitudes/",
        "r002 item 3's node type design"
      ],
      "state": "applied",
      "applied_in": "v0.3.17"
    },
    {
      "n": 9,
      "topic": "The ladder as one graph",
      "reviewer_says": "Can you also try in a different page a graph visualisation (using one of the JavaScript graph visualisation libraries) of these multiple layers (with more or less content based on config options). I think it will be very interesting to see the relationships between the nodes at the multiple layers (for example the concepts linked between multiple layers, or the contradictions, should become visible).",
      "comment": "Built at [/altitudes/graph.html](../altitudes/graph.html), and the prediction was right: the columns are good at one path and blind to everything else, and drawing the whole structure at once makes the non-tree parts the subject. Cytoscape.js, **vendored into the site rather than loaded from a CDN**, because a page about traceable structure should not depend on somebody else's uptime, and because this site has never had a runtime dependency it does not hold.",
      "proposal": "Configurable as asked: levels on and off, node kinds (units, findings as nodes, claims, which add about forty), colouring by altitude, taxonomy class or evidence, four layouts including a layered one that places each altitude in its own band, label density and node sizing. Three things it shows that the columns cannot. **First**, the book is far less of a tree than its contents page suggests: forty-two cross-references between chapters, **measured from the book's own markdown rather than asserted**, run sideways across a compression tree of thirty-five edges — and the busiest source is the glossary, which no table of contents would predict. **Second**, where two findings touch the same unit: chapter 12 is held by the database contradiction and by the cross-estate edge-count finding at once, which is invisible in a list and obvious in a picture. **Third**, colouring by evidence redraws the argument's shape — evidenced units cluster in the proof chapters while the argument chapters run amber. One design decision worth the founder's eye: **a contradiction is a node, not an edge.** An edge meaning 'contradicts' would have to be its own inverse, which this book's grammar bans, so each finding is reified and `flags` the units it involves, with `flagged_by` as the inverse. The grammar chapter applied to a picture of the book itself.",
      "needs": [],
      "impact": [
        "new page",
        "vendored dependency (a first for this site)",
        "r002 item 6's chapter graphs"
      ],
      "state": "applied",
      "applied_in": "v0.3.18"
    }
  ]
}
