feat: one hue per layer — gold source, blue persona, purple clone - #81
Open
khaneight wants to merge 3 commits into
Open
feat: one hue per layer — gold source, blue persona, purple clone#81khaneight wants to merge 3 commits into
khaneight wants to merge 3 commits into
Conversation
…til a persona **The graph is three layers now, and the middle one is the persona.** Source material the author wrote, the traits distilled from it, and the work produced from those. `LAYERS` is published in the bundle with names and descriptions, so a front end cannot invent its own account of what the archive is made of. An affirmed trait is a node with an edge down to every document it was read out of and up to every article written from it. That chain is the whole claim the picture makes: a sentence in a generated essay can be followed back through the trait that produced it to the passage in the corpus that supports it. `proposed` traits are absent, for the same reason they are absent from `persona` — drawing an unconfirmed reading of somebody in the middle of the picture asserts it to every reader before that person has seen it. Every article sits in the work layer whatever its origin. Depth answers "what kind of thing is this"; `origin` and `extrapolated` answer "how was it written", and splitting the rings by origin would put a compiled article and a machine-written one at different depths while the legend claims depth means layer. **Hovering a node lights up what it is related to** — its edges drawn in its own colour, its neighbours held bright, everything else dimmed. **Topics filter the graph**, built from the archive's own vocabulary: the domains things are filed under and the tags on them, with counts, any number selectable. Traits have no topic of their own — a trait is a claim about a person, not about a subject — so they stay while anything they touch does. Trait labels on the graph are their ids rather than their claims, which are whole sentences; the claim is still the title in the reader, where there is room to read it. **`value` joins the trait kinds**, and they are ordered surface inwards: style, pattern, principle, value, belief. A principle says *do this*; a value says *this matters*, and the same value produces different rules in different settings. Keeping them apart is what lets the clone extend a view rather than only repeat its conclusions. `/sentinel-clone` gains the distillation method: one pass per kind, with the question that finds each and the test for whether you have one, the principle/value confusion called out, calibration for `confidence`, and an instruction not to fill the table — a trait invented to complete the set is one the user then spends time rejecting. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
**Every edge now points away from the author.** A source document did not cite an article — the article was compiled from it. A trait did not reference a source — it was distilled out of one. The arrows were recorded the other way round, which drew a picture in which the work produced the corpus. Each carries a kind, declared in `EDGE_KINDS` with the layers it joins: `distils` (source→trait), `writes` (trait→work), `compiles` (source→work, for an article compiled without passing through the persona), and `links` (work→work). A test asserts every emitted edge joins the layers its kind declares and that no kind runs inward, enumerated from the published set rather than from a list in the test. **Hovering follows the chain, transitively, and which way depends on what is under the cursor.** A source document shows what came of it: the traits read out of it, and — continuing outward — the work written from those. A piece of the clone's work shows where it came from, back through the persona to the corpus. A trait sits in the middle and both directions are its own story. Stopping at one hop would show a trait without the essay it produced, which is the half worth seeing. Direct `[[wikilink]]` references stay one hop. Transitive there would light most of the wiki and say nothing. **Connections are coloured by where they leave**, so the eye can follow one hue outward: gold out of the source material, teal out of the persona, blue between articles. They keep that colour at rest, faintly — a grey web that only becomes meaningful on hover hides the structure the rest of the page is about. Two mistakes of my own worth recording. A multi-edit script asserted its way out before writing, so the chain walk never landed and the page threw `chain is not defined` on first hover — caught by hovering it rather than by the tests, which do not run the page. And a scan script that clicked every node to find one left the canvas blank, which I nearly diagnosed as a rendering bug before reloading and finding it clean. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Colour used to carry two things at once: a node's domain *and*, for generated work, that it was generated. A reader had to know which of those a hue was telling them. Now hue means exactly one thing — the layer — and a connection takes the colour of the layer it leaves, so gold on a dot and gold on a line say the same thing. Domains lost their swatches, which is no loss: the topic filter answers "what is this about" better than seven colours ever did, and the legend was claiming a mapping the eye could not hold anyway. That leaves a problem worth naming rather than absorbing. Purple was how generated work was marked, and marking it is a safeguard, not decoration. So on the outer ring a **filled** dot is something a language model wrote and a **hollow** one was compiled from a source. Filled draws the eye, which is the right way round, and it survives at any size and any dimming level in a way a hue shift would not. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This was referenced Aug 28, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stacked on #80. First half of the request.
A connection takes the colour of the layer it leaves, so a hue means the same
thing on a dot and on a line.
Domains lost their swatches. No loss — the topic filter answers what is this
about better than seven colours did, and the legend was claiming a mapping the
eye could not hold.
One thing I had to solve rather than just do
Purple was how generated work was marked, and that is a safeguard, not
decoration. Making the whole outer ring purple would have quietly removed it.
So on that ring a filled dot is something a language model wrote and a
hollow one was compiled from a source. Filled draws the eye, which is the
right way round, and it survives at any size and any dimming level in a way a
hue shift would not. The legend and the callout both say so.
If you'd rather have it some other way, easy to change — but I didn't want to
drop the distinction silently.
540 tests, clippy and fmt clean. Part two (should clone work always emerge from
persona?) written up separately rather than built.
🤖 Generated with Claude Code