Skip to content

feat: one hue per layer — gold source, blue persona, purple clone - #81

Open
khaneight wants to merge 3 commits into
mainfrom
feat/layer-colours
Open

feat: one hue per layer — gold source, blue persona, purple clone#81
khaneight wants to merge 3 commits into
mainfrom
feat/layer-colours

Conversation

@khaneight

Copy link
Copy Markdown
Owner

Stacked on #80. First half of the request.

layer dot edges leaving it
source material gold gold
persona blue blue
the clone's work purple purple

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

khaneight and others added 3 commits August 27, 2026 00:47
…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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant