the design
What this graph is, and what it is not
It is a network of asserted relations between named things, each relation carrying the paragraph it came from and a quote from it. It is not a subsumption ontology, and most of what an ontology engineer would look for is missing on purpose. This page says what the design is, what it leaves out and why, It then runs the standard pitfall scan over the graph and reports what it finds, including the findings that are these decisions showing up as defects.
Two tiers
The first tier is the relation as Jung's sentence phrased it. It is frozen: the string is part of the claim that was gated, and a model of a different family judged the paragraph against exactly that wording. Rewriting it into a controlled predicate would change what was verified.
The second tier is the family: a classification over the verified relation, drawn from a fixed vocabulary in a versioned document, assigned when two models reading that document independently name the same family, and ruled by a person when they do not. The second tier never reopens the first. Nothing on this site calls a family verified, and no family assignment changes a relation string.
The two words verified and assigned are deliberately kept apart. Different evidence, different word.
These are our families. They record how this project sorted relations Jung wrote. Not a structure discovered in his thought, and not a position the field has agreed on. The graph is a map of assertions rather than a reading, and that holds harder in the second tier than anywhere else on the site.
Where a relation carried a whole clause, a normalization layer records a cleaned verb phrase beside the frozen original, with the qualifiers pulled out into their own fields. 260 relations carry that layer. The family layer classifies the normalized form where it exists, which is why the map counts effective strings rather than surface ones.
symbolizes 99represents 20signifies 18expresses 13The declarations
Two properties are declared, and only two: which relation strings are inverses of each other, and which are symmetric. Each declaration is transcribed from a line of the definitions document, cites that line, and is applied only when a reader asks for closure. The derived row is labelled, carries its source edge's references, and is never written into the graph.
| strings | kind | transcribed from |
|---|---|---|
symbolizes / symbolized-by |
inverse | 1. symbolization (line 371) Method and precedents — what is reused, what is rejected, and why (table row: OWL characteristics) (line 131) |
produces / produced-by |
inverse | Method and precedents — what is reused, what is rejected, and why (table row: OWL characteristics) (line 131) 13. generation (line 559) |
produces / originates-in |
inverse only where the edge carries generation |
13. generation (line 559) |
manifests-as / is-aspect-of |
inverse | 3. manifestation (line 393) |
synonym-of |
symmetric | 4. archetypal-identity (line 415) Method and precedents — what is reused, what is rejected, and why (table row: OWL characteristics) (line 131) |
manifests-as / aspect-of |
inverse | 3. manifestation (line 405) |
manifests-as / is-dark-aspect-of |
inverse carries dark aspect into the derived row |
3. manifestation (line 405) |
rulings behind them
| date | ruled by | ruling |
|---|---|---|
| 2026-08-13 | the maintainer (validation session) | The middle ruling on the doc-listed manifestation inverse strings: `aspect-of` activates as a plain inverse of manifests-as (lossless flip); `is-dark-aspect-of` activates WITH its qualifier carried — derived rows display 'dark aspect' so the reverse reading stays exactly as strong as Jung's stored assertion. General principle adopted as precedent for all future strings: a derived row must carry everything the stored row asserted; if the flip cannot carry a qualifier, the declaration is not made. |
Where the checks come from
The scan follows the OOPS! catalogue, the OntOlogy Pitfall Scanner, which numbers the modelling faults that recur across published ontologies and describes how each can be detected. A pitfall catalogue is not a standard to comply with; it is a list of the places ontologies are known to go wrong, so that an evaluation can be systematic instead of a matter of taste. tools/ontology_qa/quality.py implements a subset of it locally against this graph, and keeps the catalogue's numbering so a finding can be looked up in the literature. It is not the OOPS! service and does not run its full test set.
| pitfall | what the catalogue names | use here |
|---|---|---|
| P02 | synonymous elements not declared equivalent | as the catalogue has it |
| P03 | a bare `is` used where a subclass or type relation is meant | as the catalogue has it |
| P04 | elements left unconnected to the rest of the ontology | as the catalogue has it |
| P05 | an inverse relationship defined the wrong way round | read here as inverse pairs present in the vocabulary but undeclared |
| P06 | a defect in the class hierarchy | read here as the absence of a hierarchy to have a defect in |
| P08 | elements left without human-readable annotation | as the catalogue has it |
| P10 | classes never declared disjoint | as the catalogue has it |
| P11 | a property with no declared domain | as the catalogue has it |
| P12 | equivalent properties not declared equivalent | as the catalogue has it |
| P13 | inverse relationships not declared | as the catalogue has it |
| P21 | a catch-all class doing the work of a distinction | as the catalogue has it |
| P22 | no naming regularity across the vocabulary | as the catalogue has it |
| P24 | a name that carries a definition instead of naming a term | applied here to predicates that carry a whole proposition, and to labels that are sentences |
| P25 | a relationship declared inverse to itself | read here as a symmetric relation asserted in one direction only |
| P30 | equivalent elements not declared equivalent | read here over identity chains between nodes |
The pitfall scan
Run at every build by tools/ontology_qa/quality.py, which reads the graph and writes nothing. The four figures below are its own; the table under them is every finding it reported, with this project's stance beside each one. 7 of the 19 findings are decisions recorded above, 8 are answered by the declarations, and 4 are open defects carried in the record.
19 findings: 7 recorded design decisions, 8 answered by the declarations, 4 open defects.every finding, with its stance
| severity | the scan's finding | stance |
|---|---|---|
| critical | P22 no naming/vocabulary regularity 745/949 relations (79%) are used exactly once. The relation set is open-vocabulary, not an ontology property set. |
recorded design decision The relation slot holds Jung’s own predication, frozen verbatim. A closed property set would mean editing the claim to fit the schema, so the vocabulary stays open and the family layer classifies over it. |
| critical | P24 relation name encodes a proposition 270 relations are sentence-shaped — the predicate carries content that belongs in the object or a qualifier, so it can never be queried or reasoned over. |
open: recorded as a defect A predicate carrying a whole proposition is the project’s named defect. New mining is constrained by a form rule, and the normalization layer repairs the old edges beside their frozen originals rather than over them. |
| critical | P02/P30 synonymous relations, identity/equivalence 12 distinct relation strings express the same semantics across 79 edges, with no equivalence declared. A query on any one misses the rest. |
answered by the declarations layer Equivalence is stated by the family layer, per edge in its paragraph rather than per string in the abstract; where the definitions document rules on a specific pair, a declaration records it and the query layer applies it at read time. |
| critical | P02/P30 synonymous relations, symbolisation 12 distinct relation strings express the same semantics across 186 edges, with no equivalence declared. A query on any one misses the rest. |
answered by the declarations layer Equivalence is stated by the family layer, per edge in its paragraph rather than per string in the abstract; where the definitions document rules on a specific pair, a declaration records it and the query layer applies it at read time. |
| critical | P02/P30 synonymous relations, analogy/correspondence 10 distinct relation strings express the same semantics across 125 edges, with no equivalence declared. A query on any one misses the rest. |
answered by the declarations layer Equivalence is stated by the family layer, per edge in its paragraph rather than per string in the abstract; where the definitions document rules on a specific pair, a declaration records it and the query layer applies it at read time. |
| critical | P02/P30 synonymous relations, part/containment 10 distinct relation strings express the same semantics across 54 edges, with no equivalence declared. A query on any one misses the rest. |
answered by the declarations layer Equivalence is stated by the family layer, per edge in its paragraph rather than per string in the abstract; where the definitions document rules on a specific pair, a declaration records it and the query layer applies it at read time. |
| critical | P02/P30 synonymous relations, generation/origin 15 distinct relation strings express the same semantics across 69 edges, with no equivalence declared. A query on any one misses the rest. |
answered by the declarations layer Equivalence is stated by the family layer, per edge in its paragraph rather than per string in the abstract; where the definitions document rules on a specific pair, a declaration records it and the query layer applies it at read time. |
| critical | P02/P30 synonymous relations, transformation 8 distinct relation strings express the same semantics across 24 edges, with no equivalence declared. A query on any one misses the rest. |
answered by the declarations layer Equivalence is stated by the family layer, per edge in its paragraph rather than per string in the abstract; where the definitions document rules on a specific pair, a declaration records it and the query layer applies it at read time. |
| critical | P06/no backbone: taxonomy is vestigial Only 37/2091 edges (1.8%) are taxonomic and only 33/589 nodes (6%) have any parent. There is no subsumption hierarchy to inherit or reason over — this is an associative network with a 6-way type tag, not a subsumption ontology. |
recorded design decision This is an associative network with a type tag, not a subsumption ontology, and the paper describes it as one. There is no hierarchy to inherit through because none was claimed. |
| important | P05/P13 inverse relations declared but not linked 8 inverse pairs coexist in the vocabulary (symbolizes/symbolized-by, precedes/followed-by, contains/belongs-to, produces/produced-by, mother-of/child-of, father-of/child-of, is-goal-of/aims-at, exemplified-by/exemplifies). Nothing declares them inverse, so direction is a modelling choice made per-edge; 3 pairs are asserted in both directions and would be duplicates under a reasoner. |
answered by the declarations layer The declarations name the inverse pairs the document rules on. They are applied when a query asks for closure and are never written into the graph. |
| important | P25 symmetric relation asserted one-way only 186 edges use a symmetric relation but only assert one direction. Without a symmetry axiom, `A synonym-of B` does not answer a query for B's synonyms. |
answered by the declarations layer Same answer: a symmetric declaration is read at query time. Asserting the second direction in the graph would put a claim in it that no paragraph was gated for. |
| important | P30 identity clusters not collapsed / no transitivity 3 clusters of 3+ nodes are chained by identity-type relations without a transitivity axiom or a canonical representative. These are candidate duplicate entities. |
recorded design decision Transitivity is rejected on every family. Identity chains can be read one edge at a time by the walk in tools/query/kg_query.py, which prints each hop’s own citation and asserts nothing about the ends; it is not exposed on the site in this release. |
| important | P04 unconnected ontology element 5 component(s) detached from the main graph. |
open: recorded as a defect A detached component is a gap in what has been mined, not a decision. |
| important | P24 node label is a definition, not a term 21 nodes carry a full descriptive sentence as their label. These are assertions modelled as entities — they cannot be reused or matched across edges. |
open: recorded as a defect A label that is a sentence cannot be matched across edges. Counted here, not yet repaired. |
| important | P11/P12 no domain or range declared No relation has a declared domain/range. Observed signatures are unconstrained: `corresponds-to` spans 25 distinct (subject-type, object-type) pairs across 74 edges. Nothing can detect a mis-typed edge. |
recorded design decision No relation is given a domain or a range as a constraint. The observed signatures are a measurement of the corpus; a constraint would reject an edge because of what the schema expects rather than what the paragraph says. |
| important | P02 ambiguous predicate `is` `is` is used 26 times, conflating subsumption, identity and predication. Cannot be interpreted without reading the quote. |
recorded design decision `is` is the word Jung used. The family assignment disambiguates it per edge, in the paragraph it came from, and the verbatim string stays as written. |
| important | evidence gap 1 edge(s) carry zero references. |
recorded design decision The structural relations (sequence between stages) carry no citation by design and are excluded from the verified count. Any other relation without a reference is a defect and the structural check refuses it. |
| minor | P21 catch-all class `Concept` holds 231/589 nodes (39%) with no subdivision. The type system carries little discriminating power. |
open: recorded as a defect The type tag is coarse and does little work. It colours the map and picks the Concordance registers; nothing rests on it. |
| minor | P10 missing disjointness axioms The 6 node types are never declared disjoint, and nothing forbids a node from being conceptually two at once (e.g. Mercurius is modelled Figure but functions as Substance and Symbol across its 52 edges). Type is a single free-text field. |
recorded design decision Types are not declared disjoint. A node can function in two registers at once, and the graph would have to choose one to satisfy a disjointness axiom. |
Checked against readers of Jung
In August 2026 we put a sample of these assignments to the secondary literature: 27 items, drawn by seeded stratification and weighted toward the contested families, checked in three pre-registered passes against eight works of Jungian scholarship: Jacobi's The Psychology of C. G. Jung, Samuels, Shorter and Plaut's A Critical Dictionary of Jungian Analysis, von Franz's Alchemy: An Introduction to the Symbolism and the Psychology, four volumes of Edinger, and Abraham's A Dictionary of Alchemical Imagery. The question was not whether Jung's claim is true; the verification chain had already asked that. It was whether the kind of relation we recorded is the kind a reader of the literature would say Jung asserts.
The result, stated exactly: the literature treats 16 of the 22 sampled assignments (the other 5 of the 27 items were queued arm-disagreements, scored separately); scholars' renderings agreed with our family on 8 of those 16, disagreed on 6, and split among themselves on 2. The other 6 pairs no consulted work treats at all. Jung's image-level assertions are often simply not discussed anywhere. The disagreements were not absorbed: they produced seven rule changes, folded into the ruleset as v0.7, the largest of which sends every amplified-by edge back for reclassification because two independent reference authors read those relations as content claims, not adduced parallels.
8 of 16 treated items agreed with our family, across 8 works of scholarship.the whole table
| family | agrees | disagrees | split | not treated |
|---|---|---|---|---|
| archetypal-identity (incl. 26) | 0/3 | 1/3 | 2/3 | 2 |
| correspondence (incl. 27) | 2/3 | 1/3 | 0/3 | 2 |
| symbolization | 3/3 | 0/3 | 0/3 | 1 |
| doctrinal-attribution | 1/2 | 1/2 | 0/2 | 1 |
| amplification | 0/3 | 3/3 | 0/3 | 0 |
| controls (personif., union) | 2/2 | 0/2 | 0/2 | 0 |
| All | 8/16 | 6/16 | 2/16 | 6 |
Two limits. Agreement here is not endorsement: no scholar reviewed this vocabulary, and where the sample agreed it mostly agreed on the everyday families. And the check also measured the literature itself: the same reference author writes "X is Mercurius" and "X is a symbol of Mercurius" for the same pair, sometimes on one page. On the hardest boundary this layer draws, the field the check consulted does not hold a stable line either. The full record (sample, per-item worksheets, both review passes, the disagreements in full) is committed at docs/experiments/external_validity_2026-08/ in the repository.
Deliberately absent
7 of the findings above are these decisions, showing up as defects because the catalogue has no way to tell a choice from an oversight.
- Transitivity. No family is transitive. Two terms joined through a third are joined through a third; the graph does not claim they are the same. The depth-bounded identity walk that reads such chains one edge at a time is a command-line tool in this release (
tools/query/kg_query.py --walk) and is not exposed on the site. - Domain and range as constraints. The signatures a relation is observed with are a measurement of the corpus. As a constraint they would reject an edge for disagreeing with the schema rather than with the paragraph.
- Disjoint types. A node can work in two registers at once, and a disjointness axiom would force a choice the material does not make.
- A subsumption backbone. There is no hierarchy to inherit through, because none was claimed. The type tag is a coarse label, not a class system.
- A closed relation vocabulary. The predicate is Jung's phrasing. Closing the set would mean editing claims, so the set stays open and the family layer carries the classification.
docs/experiments/external_validity_2026-08/results.json (report v3, closed 2026-08-12);scan output from
tools/ontology_qa/quality.py --json over seed.json sha256:9dc668bfff36, run at build;declarations from
pipeline/family/relation_declarations.json, transcribed from FAMILY_DEFINITIONS v0.7.1;built 2026-09-05 at commit 5318c63