Skip to content

feat: edges radiate outward, carry their kind, and light the whole chain - #80

Open
khaneight wants to merge 2 commits into
mainfrom
feat/radiating-edges
Open

feat: edges radiate outward, carry their kind, and light the whole chain#80
khaneight wants to merge 2 commits into
mainfrom
feat/radiating-edges

Conversation

@khaneight

Copy link
Copy Markdown
Owner

Stacked on #79.

Every edge 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 edge carries a kind, declared in EDGE_KINDS with the layers it joins:

kind colour
distils source → trait gold
compiles source → article, no persona in between gold
writes trait → article teal
links article → article blue

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.

Hover follows the chain

Which direction depends on what is under the cursor:

  • a source document → what came of it: the traits read out of it, and,
    continuing outward, the work written from those
  • the clone's work → where it came from, back through the persona to the
    corpus
  • a trait → both, because both are its story

Transitive, not one hop — stopping at one would show a trait without the essay
it produced. Direct [[wikilink]] references stay one hop, because transitive
there lights most of the wiki and says nothing.

Connections keep their 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 mine, recorded

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 — the test suite doesn't execute the page, only its contract.

And a scan script that clicked every node to locate one left the canvas blank. I
nearly diagnosed that as a rendering bug before reloading and finding it clean.

540 tests (+1), clippy and fmt clean. CLAUDE.md compressed back under budget
again rather than raised — this time by merging two citation invariants that
turned out to be one rule stated twice.

🤖 Generated with Claude Code

khaneight and others added 2 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>
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