first live-extraction findings: fix backwards edge-section labels; extractor naming/self-merge/completeness doctrines
Owner's first live test of the relinked pipeline surfaced three issues,
diagnosed against the ledgers:
1. Detail-card edge labels were backwards (UI only — data and canvas
arrows were correct). Semantics pinned 2026-09-28: an edge A→B
means A implies B (follows) or A supports B (supports). Outgoing
edges now list under 'What follows from this' / 'What this
supports', incoming under 'Follows from' / 'Supported by'.
Verified against the ledger: Invariance --supports--> Twin
paradox / Relativity of simultaneity; Argumentation ethics
--follows--> Homesteading — arrows correct, only the words were
swapped. docs/architecture.md wording fixed to match.
2. Session-local terminology leaked into node names ('Criterion C',
'Action axiom (F1)'). Both extractor prompts gain a naming
doctrine: names use established, discipline-canonical terminology
(glossary-headword test); never source-local bookkeeping (letters,
numbering, positional labels); local shorthand goes to aliases.
3. Near-duplicate propositions and lonely nodes (~40% of fresh-run
nodes edge-less; 'Argumentation ethics' vs 'A priori of
argumentation' duplicated despite the auditor having linked that
phrase once). Root cause is upstream of the auditor: the extractor
had no self-merge or edge-completeness duty. Both prompts gain:
MERGE YOUR OWN OUTPUT (same claim at different precision = one
proposition, phrasings to aliases; nothing downstream dedupes) and
edge COMPLETENESS (a proposition that arose as evidence for,
consequence of, or prerequisite of another must carry the edge —
a graph of lonely nodes is a failed extraction).
Owner rulings on the open question: keep two edge types (no
'relates to' junk drawer); re-measure loneliness after these fixes.
Gates: typecheck, 1059/1059, lint, build.
This commit is contained in:
@@ -1567,25 +1567,28 @@ export function GraphView() {
|
||||
// EDGES (owner 2026-09-27): edge classification was entirely
|
||||
// hidden in the UI — the card now shows every edge this node
|
||||
// participates in, grouped by direction + type, above the
|
||||
// sessions list. Only present groups render.
|
||||
// sessions list. Semantics (owner 2026-09-28): an edge A→B means A implies/
|
||||
// supports B — OUTGOING edges list under "What follows from this" /
|
||||
// "What this supports", INCOMING under "Follows from" / "Supported by".
|
||||
// Only present groups render.
|
||||
const id = selected.node.id;
|
||||
const nodeById = new Map((snapshot?.nodes ?? []).map((n) => [n.id, n]));
|
||||
const label = (nid: string) => nodeById.get(nid)?.name ?? nid;
|
||||
const groups: { title: string; names: string[] }[] = [
|
||||
{
|
||||
title: "Follows from",
|
||||
title: "What follows from this",
|
||||
names: (snapshot?.edges ?? []).filter((e) => e.from === id && e.type === "follows").map((e) => label(e.to)),
|
||||
},
|
||||
{
|
||||
title: "Supported by",
|
||||
title: "What this supports",
|
||||
names: (snapshot?.edges ?? []).filter((e) => e.from === id && e.type === "supports").map((e) => label(e.to)),
|
||||
},
|
||||
{
|
||||
title: "What follows from this",
|
||||
title: "Follows from",
|
||||
names: (snapshot?.edges ?? []).filter((e) => e.to === id && e.type === "follows").map((e) => label(e.from)),
|
||||
},
|
||||
{
|
||||
title: "What this supports",
|
||||
title: "Supported by",
|
||||
names: (snapshot?.edges ?? []).filter((e) => e.to === id && e.type === "supports").map((e) => label(e.from)),
|
||||
},
|
||||
].filter((g) => g.names.length > 0);
|
||||
|
||||
Reference in New Issue
Block a user