Prefix: intent_.

This family is dissolving and nothing new belongs in it. It is not a layer so much as the absence of one: the shape a pipeline takes where a fact was never written down, so every reader computes it again. Each resident is a rule nobody owns, and the work in flight gives each one an owner and deletes the relation, which is why this count falls rather than grows. A rule that seems to want this prefix is a rule whose owner has not been found yet, and finding it is the change to make.

Where to start

intent_bound_table

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired.

intent_resolved_field_claim

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired.

How this family meets the others

Declared key edges
store_

4 foreign keys from this family’s rows into that one.

graphql_

3 foreign keys from this family’s rows into that one.

graphitron_

1 foreign key from this family’s rows into that one.

Why the name is right

Dissolving, and closed to new residents: what follows below describes what these relations are and how they came to be, not a standard to build another one against. The third and topmost layer of the SDL depth ordering, graphql_ under graphitron_ under this name, whose upper two layers are both derivation over what graphql_ captured: what gets derived once something resolves and combines those readings into what the generator will actually do. The residents are views plus the few tables hand-written producers fill, each of which says in its own comment why no view could express its rule; a rule SQL can state and a gatherer can run is that gatherer’s stage and leaves this family when it becomes one. That changes nothing about the name, since a family is named for whose vocabulary its rows are written in and storage is not the discriminator. The stratum has two layers, and a new resident picks one deliberately: the base derivations (the authored claim views, one per grain; the structural classifier views, one per classifier so each carries exactly its own witness columns; the resolutions those classifiers stand on, which earn their own relation as soon as a second reader asks them and which layer among themselves on that same rule, a resolution keyed on a written name sitting under the ones keyed on a coordinate; the demand and exemption rule views, stated at the grain their rules are authored at), and the reductions over them (intent_resolved_field_claim and the resolved demand views, the resolution expressions a planning reader joins). No relation may acquire this prefix at all. A crossing rule belongs to the gatherer that runs last, in a relation named for that gatherer’s vocabulary, which is what every departure from here has turned out to be. Nothing is admitted here any more, and the test that used to admit one is recorded because it is what a reader needs to understand the residents rather than to judge a candidate: an owner that is the gatherer running last rather than any one corpus’s own, decided by expand a candidate through every relation of this family it names until only captured relations are left, reading a materialized target as its rule so a registration cannot hide a crossing underneath it, and count the families those captured relations sit in, where graphql_ and graphitron_ are one family because they are one gatherer. Two or more is what this prefix is for. One means the rule belongs to that family instead, filed and named there and refreshed by the gatherer that owns it, which knows when its own corpus is complete and may therefore store the rule as one of its own stages or leave it a view. A rule that does cross still owes the cut: the part of it reading one family belongs to that family, and what stays here is the join. The contributor-facing statement of this rule, and the transaction control it presumes, are on the fact model page under the architecture docs.

intent_argmapping_bound_parameter_type (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. The Java type the left side of an argMapping pair denotes: what the value the path resolves has to be assignable to. The missing half of every type question about this family, and the reason one existed to be missing is that the two populations answering it are unrelated relations. A @routine parameter is a position on a generated Routines method and its type comes from the catalog census, while every other site’s parameter is a position on an authored Java method and its type comes from the classpath census; a reader wanting "the type of the parameter this pair binds" had to know which of the two to ask, and therefore had to switch on site, which is the switch this relation performs once. One row per pair whose parameter resolves, at graphitron_argmapping_entry’s own grain, so it joins that relation and everything derived from it on site, use_site and position with no reshaping. Two arms over that vocabulary, and the split is not the pair view’s: one resolves an authored (class, method) pair against the classpath census, and the routine arm is the other and reaches sql_routine_parameter through intent_field_routine_method instead. It was eight arms until graphitron_method_reference_entry existed, seven of them resolving an authored pair the same way and differing only in which owner relation carried it. Those seven were one join all along, and what made them seven was that the class and the method were spelled in seven places instead of one; the reconstruction is now a join on the site key the pair relation already carries. A ROUTINE pair names a database routine and no Java method, so it draws no row from that relation and the inner join drops it, which is what the seven site literals used to do by enumeration. Matching is by parameter name on both sides, which is the same match the generator itself makes and inherits the same dependency: a consumer compiling without -parameters has no names to match, so a pair resolves nothing here and every reader sees that as absence. One vocabulary on both arms, and reaching it is the reason the classpath arm joins one relation further than it looks like it needs to. The catalog arm’s binding type is fully qualified, while code_type.display_name drops the package by design; comparing the two would never match, and the mismatch would look exactly like a genuine type disagreement. So the classpath arm takes the root of the parameter’s declared-type decomposition instead, code_type.root_class, which is the qualified binary name. That relation has no row where the position names no class, so a primitive parameter resolves no type here rather than resolving int. The join to it is therefore an outer one and such a parameter is a row carrying a NULL intent_argmapping_bound_parameter_type.java_type, which is the membership question and the type question being kept apart on the terms intent_node_id_decode_slot states for the same chain: the name-matched code_method_parameter row is what makes the pair a member, and the type is a payload the row may not carry. intent_argmapping_key_column_candidate.column_java_type is the other operand of the very same equality and already reads this way, its comment arguing that such an absence is a payload absence rather than a missing row. Absence of a row is therefore three facts and this relation distinguishes none of them: the reference resolved no method, the method declares no parameter of that name, or names were not compiled in. A fourth, the parameter’s type naming no class, is a NULL payload on a row that is here. That is deliberate, each being a condition other relations already state or reject, and it is what keeps this relation one answer rather than a verdict; what a reader does where the answer is missing is the reader’s own decision, and the projection’s own comment argues its choice. What it must not do is decide the reading, which is why candidates is a column: an overloaded method or a class declared by two classpath entries resolves two rows, and a reader requiring one type requires candidates = 1 rather than picking. DISTINCT within each arm collapses the ordinary duplicate, one method reached through two graph sources naming the same type, so candidates above one means the types genuinely differ. No assignability rule lives here and none should: this states one type per pair and comparing it to another is the asking reader’s predicate, the widenings worth admitting being a use-site question rather than a fact about a parameter.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from the pair relation

site (CHARACTER VARYING, nullable)

which SDL site spelled the pair, in graphitron_argmapping_entry’s closed vocabulary of nine; with the use-site key and the position this is the grain, and it is what decided which of the two censuses answered

use_site (CHARACTER VARYING, nullable)

the consuming coordinate, serialized as graphitron_argmapping_entry serializes it; carried rather than re-spelled, which is why the arms here join that relation instead of the eight owner relations directly

position (INTEGER, nullable)

the pair’s 0-based position within its own argMapping list, completing the grain

param_name (CHARACTER VARYING, nullable)

the left side of the pair as the author wrote it, which is also the parameter name the match was made on

java_type (CHARACTER VARYING, nullable)

the parameter’s Java type, fully qualified: sql_routine_parameter.binding_type on the routine arm and code_type.root_class on the other seven. Qualified on both by construction, which is the whole reason the classpath arm reads the type rather than the parameter row beside it; the view’s own comment states that. The root of the declared type and so the raw head of a parameterised one, java.util.List rather than List<Film>: a comparison caring about what the type delivers instead reads code_type_element, which answers the other question and answers it for the same type key. NULL where the root names no class, which a primitive, a void, an array and a type variable are alike in; the reader that has to tell those apart reads the spelling beside it

candidates (INTEGER, nullable)

how many distinct answers this pair resolved, this row’s being one of them; 1 on an unambiguous parameter. An answer is the pair of intent_argmapping_bound_parameter_type.java_type and intent_argmapping_bound_parameter_type.parameter_type, both being inside the arm’s own DISTINCT, so two untypeable overloads at one position (an int and a long) are two rows reporting 2 rather than one row claiming an unambiguous answer. 1 therefore says the resolution is unambiguous and no longer says a type resolved: intent_argmapping_bound_parameter_type.java_type is what says which of the two a row carries, and a reader needing a type tests that column rather than this one. Above one means an overload set or a doubly-declared class whose parameters of this name differ, which is a resolution nothing here picks between: a reader that must have one answer requires 1, on intent_bound_table.candidates' terms

parameter_type (CHARACTER VARYING, nullable)

the source spelling of the parameter’s declared type with its packages dropped, from code_type.display_name; NULL on every routine-arm row, a database routine having no Java parameter row to read it from. The spelling a message shows a person, which is what the one reader does with it, naming the primitive an author declared where a boxed type was needed. It keeps its type arguments where the census spelling it replaced erased them, so two overloads taking a list of different elements are two answers at one position rather than one: that is a finer reading than before and the right one on this relation’s own terms, candidates existing to say that a position resolved more than one way rather than to collapse the ways. Not a second spelling of intent_argmapping_bound_parameter_type.java_type and never compared with one: the two spellings answer different questions and an equality across them would read as a genuine disagreement, which is the whole reason the classpath arm reaches code_type for the type at all. What this column is for is the one distinction that decomposition cannot make, a declared type that names no class being a primitive, an array or a type variable alike; a consumer refusing a primitive tests this against the eight primitive spellings, a closed vocabulary and the same spelling its message quotes. It rides here rather than being re-resolved downstream because the consumer already joins this relation on this grain, and re-spelling the classpath chain to reach one column would be a third spelling of one resolution

intent_argmapping_key_column_candidate (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. The key column an argMapping binding of a node id projects out of the decoded key, with that column’s Java type beside it where the catalog can say: the name half of the projection resolution, before the type half decides whether the value can reach the parameter. Two arms over populations that are disjoint by whether a name trails the binding, because there are two ways to arrive at one key column and they are one destination rather than two. The authored arm is a trailing name naming a key column, which is the capability this family shipped with. The inferred arm is a binding that names no segment at all against a node type whose key is one column: nothing else it could mean, so the sole column is the projection and the author did not have to spell it. Whether the author named it is provenance and not shape, readable from trailing_name beside it, and both arms yield the same column with the same type reached the same way, which is what makes the emitted decode one emission rather than two. Their disjointness is a nullness rather than a precedence: a trailing name against none, on the match’s own column. The inferred arm reaches arity through intent_resolved_node_key_shape rather than counting the key list here, so the arity this population turns on is the same number the decode relation’s slot arm turns on, and the sole column’s type comes off that relation’s own payload rather than being a second spelling of the same catalog reach. Two or more key columns is no row on either arm and the detection beside this states why: one binding carries one value, so there is nothing to infer. Split out from intent_resolved_node_key_projection rather than living inside it, and the split is what lets a type mismatch be its own verdict: the detection beside it states an unknown column as the absence of a row here and a type disagreement as a row here with no projected row, so the two arms are disjoint by construction and neither has to re-test the other’s predicate. Absent this relation, adding the type predicate to the projection’s own join would have collapsed both into the unknown-column message, which names the wrong thing and offers the wrong remedy: an author who spelled the column correctly would be told it does not exist. The name match is the membership condition and the type is a payload, which is why the reach for it is an outer join and its absence is a NULL rather than a missing row. Requiring it would have re-broken exactly what the split fixed, and for a case the key-column relation deliberately admits: the pinned-SDL tier answers with no table at all, its own comment saying that a name resolving against nothing is a row there and a detection elsewhere, so a pinned key column under an unbound or ambiguously-bound node type would have stopped being a candidate and been reported as a column that does not exist. It stays a candidate with no type, and the gate downstream stands aside. Case-insensitive on both crossings, the authored spelling against the resolved key column and the resolved key column against the catalog. Neither operand of the first is a stored fold any more: the authored name is graphitron_argmapping_entry.tail_name and is folded there, on the relation that owns the spelling, so this side of the comparison is a stored column an index can serve. The key column is the side with nowhere to fold, coming out of a three-tier pick no single base relation owns, and it is folded per row here. The inferred arm crosses only the second of them, having no authored spelling to fold.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from the binding leaf

site (CHARACTER VARYING, nullable)

which SDL site spelled the pair, in graphitron_argmapping_entry’s closed vocabulary of nine

use_site (CHARACTER VARYING, nullable)

the consuming coordinate, serialized as graphitron_argmapping_entry serializes it; with site and position the grain

type_name (CHARACTER VARYING, nullable)

the spelling site’s owning type

field_name (CHARACTER VARYING, nullable)

the spelling site’s field name within that type

position (INTEGER, nullable)

the pair’s 0-based position within its own argMapping list

written_path (CHARACTER VARYING, nullable)

the path as written, carried so a message quotes the author’s own spelling

bound_kind (CHARACTER VARYING, nullable)

ARGUMENT where the decoded node id is a field argument, INPUT_FIELD where it is an input field reached below one; carried from the binding leaf

bound_type_name (CHARACTER VARYING, nullable)

the leaf’s owning type, carried from the binding leaf

bound_field_name (CHARACTER VARYING, nullable)

the leaf’s owning field on an ARGUMENT leaf, the input field itself on an INPUT_FIELD leaf

bound_argument_name (CHARACTER VARYING, nullable)

the argument’s name on an ARGUMENT leaf; NULL on an INPUT_FIELD leaf

node_type_name (CHARACTER VARYING, nullable)

the node type the leaf’s @nodeId names, as written

column_name (CHARACTER VARYING, nullable)

the projected key column, spelled as the winning key-column tier spells it rather than as the author wrote it, on intent_resolved_node_key_projection.column_name’s terms. The column a trailing segment matched on the authored arm, and the node type’s sole key column on the inferred one, where there was nothing to match against

key_position (INTEGER, nullable)

the projected column’s 0-based position within the node key; 0 on every inferred row, a one-column key having no other position

tier (CHARACTER VARYING, nullable)

which key-column population answered for this node type, carried from graphitron_node_keycolumn’s closed vocabulary of three

column_java_type (CHARACTER VARYING, nullable)

the column’s Java type as jOOQ binds it, fully qualified, from sql_column.binding_type: the type of the value the emitted record read yields, and the left operand of the agreement the projection requires. The binding type and not the SQL type, because what the emitted code hands the parameter is a Java value off a jOOQ record. NULL where the catalog cannot answer, which is a node type with no unambiguous table binding or a pinned key column the bound table does not have; the view’s own comment argues why that is a payload absence rather than a missing row, and the projection stands aside on it exactly as it does on an unresolved parameter type

leaf_named_type (CHARACTER VARYING, nullable)

the opened leaf’s own SDL named type, carried from the binding leaf so a message about this candidate need not re-join for it

leaf_is_list (BOOLEAN, nullable)

whether the opened node id is list-shaped, carried from the binding leaf. A list candidate is a real one, naming the list of this column across the decoded ids, and nothing here or in the detection rejects it; what stands between it and emission is that no emitter builds that shape yet, which is the consumer’s deferral to mint and the reason this column is carried rather than filtered on

trailing_name (CHARACTER VARYING, nullable)

the name the author spelled beyond the bound element to name this column, NULL on the inferred arm where a one-column key needed no name. Read off graphitron_argmapping_entry.tail_name, which is where the authored spelling lives; the resolution beside it says which candidate bound and does not copy the writing forward, so the fold this crossing needs sits on a stored column rather than being computed per row

intent_argmapping_projection_defect (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. What is wrong with an argMapping binding that descends past an input object: one row per defective entry, in a closed verdict vocabulary of five, over the match and the resolved key columns alone. The rejections that close the silent hole this family had, where a path bound a node id and the base64 wire id went to the database verbatim with nothing in the build saying a word. Every arm is a positive statement about a captured population rather than a negative space maintained by hand: the match relation says what each path bound, whether that thing declares a decode and what type it is, and the entry beside it says what was written, and these are the five ways such a path fails to become a projection. Which arm fires is decided by node_id_declared, whether the bound path is the whole written path or one name short of it, and two existence tests against the candidate relation, one in each of those two buckets, so the arms are disjoint by construction and no precedence rule is needed. That first comparison is the resolution against what the author wrote rather than a name this relation was handed: the match states what bound and the entry states what was written, and the difference between them is the question. A whole path bound under a declared decode is where the arity rule reaches this family, and BARE_NODE_ID is what is left of it. A one-column key needs no name, the sole column being the only thing such a binding could project, so it resolves as an inferred candidate next door and draws no row here. What remains is a binding with nothing to infer, and there are three ways to be one. They share a verdict because the defect is one and differ in a clause the consumer composes from node_type_ref and the key list: a directive naming no type, so there is no key list to count; a named type resolving no key columns on any tier, so the count is zero; and a named type whose key is two or more columns, where one binding carries one value and nothing says which. The arm is spelled as the absence of a candidate rather than as an arity test of its own, which is the same anti-join UNKNOWN_KEY_COLUMN uses one bucket over, so what resolves and what is refused are decided by one relation and cannot drift into two arities that disagree. One trailing name means the author named the column themselves, and then the resolution either succeeds (a row of intent_resolved_node_key_projection and no row here) or names what stopped it: MISSING_TYPE_NAME where the directive carries no typeName: and there is no containing table at this position to infer one from, UNKNOWN_KEY_COLUMN where the trailing name matches no resolved key column of the named type, KEY_COLUMN_TYPE_MISMATCH where it matches one whose Java type the consuming parameter cannot take. That last arm is the one the arity rule widens rather than shrinks, and deliberately: it drives off the candidate relation, so an inferred candidate whose sole column disagrees with the parameter draws the same refusal an authored one does, and a binding the arity rule stopped rejecting for being bare is not thereby allowed to hand a parameter a value it cannot take. Which of the two ways the column was reached is trailing_name’s to say, and it says it by being NULL, that column being read off the entry rather than forwarded through the resolution. This relation is where all of it is decided, and that is the whole of the design rather than a convenience. The schema walk that mints the binding runs before capture, so it has no store to consult; a rule spelled there would be an earlier, unfalsifiable second copy of one of these arms, and it would win by rejecting first, which is exactly how a family ends up with two answers that agree until one changes. So the walk carries every segment it cannot resolve against SDL and judges none of them, and every judgment about them is here. UNDECLARED_NODE_ID exists because of that division and would otherwise look redundant: it covers a path opening something with nothing to open, an ID carrying no @nodeId, and equally a String or an enum, the leaf_named_type column being what lets one message offer two remedies. A sixth verdict stood beside it for a path spelling two or more names past what it opened, and it is gone rather than unreported: the candidate relation now holds every legal spelling at a coordinate, so such a path names nothing there and is refused with every other unresolvable spelling instead of being a partial resolution with a count. Telling the two apart again would mean storing a decomposition of the written path, which is the relation this shape removed. Two shapes deliberately stay out, and both are stated because each was once mistaken for an arm. A list-shaped node id with one trailing name is not a defect: it names the list of that key column across the decoded ids, which is a coherent request, so it resolves as a projection and carries leaf_is_list, and what stands between it and emission is that no emitter builds that shape yet. And a projection that resolves at a site whose emitter is not wired is the same kind of fact. Both are deferrals rather than author defects, and whether an emitter exists is a fact about the generator’s own code and not about the schema, so their arms live with the consumer that knows the wired set (no.sikt.graphitron.model.derive.ArgmappingProjectionDefects) rather than being asserted by a view that cannot see it. An entry that bound nothing at all also has no row: nothing at its coordinate is spelled that way, which is the one rejection the walk still owns because it is a question about the SDL surface in front of it rather than about captured facts. Every arm is use-keyed rather than definition-keyed, which is the point of resolving at the pair’s grain: one input type can be consumed by a routine call with no containing table and by a table-bound mutation where inference works, so an author told to add typeName: is being asked to satisfy a use-site constraint and the message has to name the use site that is asking. Locations are the owning directive application’s, carried from graphitron_argmapping_entry, so a message points at the argMapping the author wrote rather than at the input type’s declaration. There is no message column: the closed vocabulary plus the witness columns are the fact base, and the prose belongs with the consumer that composes it. Nor is there a rendered candidate list, though a message about a named type wants one: a consumer joining graphitron_node_keycolumn on the graph and node_type_ref gets the columns as rows in key order, and a render here would have to be split apart to be used, which is the one thing no reader of this schema does.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from the binding leaf

site (CHARACTER VARYING, nullable)

which SDL site spelled the defective pair, in graphitron_argmapping_entry’s closed vocabulary of nine; with the use-site key and the position this is the grain, and it is what a message reads to name the directive the author wrote

use_site (CHARACTER VARYING, nullable)

the consuming coordinate, serialized as graphitron_argmapping_entry serializes it: the use site whose constraint is being violated, which a message about a definition-keyed remedy has to name so the author knows which consumer is asking

type_name (CHARACTER VARYING, nullable)

the spelling site’s owning type; with the field beside it, the coordinate a validation error attaches to

field_name (CHARACTER VARYING, nullable)

the spelling site’s field name within that type. An input field on the INPUT_FIELD_CONDITION arm, an output field on every other

position (INTEGER, nullable)

the defective pair’s 0-based position within its own argMapping list; part of the grain, so two defective pairs of one application are two rows rather than one

param_name (CHARACTER VARYING, nullable)

the left side of the pair, carried from graphitron_argmapping_entry so a message quotes the whole entry the author wrote rather than half of it

written_path (CHARACTER VARYING, nullable)

the right side as written; quoted in the message beside the parameter, so an author reads back their own spelling rather than a normalised one

verdict (CHARACTER VARYING, nullable)

which defect, in a closed vocabulary of five: UNDECLARED_NODE_ID where a path opens something that declares no @nodeId and so has nothing to open, BARE_NODE_ID where a declared decode names no key column and none can be inferred, MISSING_TYPE_NAME where a projection is asked for against a @nodeId carrying no typeName:, UNKNOWN_KEY_COLUMN where the trailing name matches no resolved key column of the named type, KEY_COLUMN_TYPE_MISMATCH where it matches one whose Java type the consuming parameter cannot take. Disjoint by construction over two columns and two existence tests: node_id_declared splits the first off, trailing_name being NULL or not splits the rest, the NULL bucket keeps only what resolves no candidate, and within the other a typeName: test and then a candidate-row test separate the last three. The mismatch arm is the one that spans both buckets, driving off candidates rather than matches, and its trailing_name says which. This column is a discriminator a consumer switches on and never a precedence to re-test

bound_kind (CHARACTER VARYING, nullable)

ARGUMENT where the defective leaf is a field argument, INPUT_FIELD where it is an input field; carried from the leaf, and what tells a reader which @nodeId relation the directive sits on

bound_type_name (CHARACTER VARYING, nullable)

the leaf’s owning type, carried from the leaf: the type declaring the input field on an INPUT_FIELD leaf, the argument’s own owning type on an ARGUMENT one. With the two columns beside it, the @nodeId row’s own key, so a consumer wanting the directive’s own source position is one join away

bound_field_name (CHARACTER VARYING, nullable)

the leaf’s owning field on an ARGUMENT leaf, the input field itself on an INPUT_FIELD leaf

bound_argument_name (CHARACTER VARYING, nullable)

the argument’s name on an ARGUMENT leaf; NULL on an INPUT_FIELD leaf, whose key needs no argument component

node_type_ref (CHARACTER VARYING, nullable)

the typeName: the leaf’s @nodeId names, as written. NULL on every MISSING_TYPE_NAME row, that being the arm’s own condition, and NULL or not on a BARE_NODE_ID row, which selects between clauses of that arm’s remedy rather than making a second verdict. Never NULL on an UNKNOWN_KEY_COLUMN row, nor on a KEY_COLUMN_TYPE_MISMATCH one, both arms resolving against a named type

trailing_name (CHARACTER VARYING, nullable)

the one name the author spelled past the element that bound, NULL on the arms where the whole path bound. Carried from graphitron_argmapping_match and quoted by the messages that name what could not be resolved. A name and not a count: past one name a path names nothing at its coordinate and draws no match row, so there is no defect row here to carry a larger number

leaf_named_type (CHARACTER VARYING, nullable)

the SDL named type of the thing the path tried to open, carried from the binding leaf. What separates the two remedies the UNDECLARED_NODE_ID arm has to offer: an ID is told to annotate it @nodeId(typeName:), anything else is told it has nothing to open at all. Present on every arm because it costs nothing and a message about any of them may name it

column_java_type (CHARACTER VARYING, nullable)

the projected column’s Java type as jOOQ binds it, fully qualified; the left operand of the comparison that rejected the pair. Non-NULL exactly on the KEY_COLUMN_TYPE_MISMATCH arm, that arm being the only one about a type, which is the stated absent bucket rather than a missing value on the other three. Carried rather than left to the consumer to resolve, so a message states the operands the join actually compared and cannot describe a different comparison than the one that fired

param_java_type (CHARACTER VARYING, nullable)

the consuming parameter’s Java type, fully qualified, from intent_argmapping_bound_parameter_type; the right operand, non-NULL exactly where the column beside it is

source_name (CHARACTER VARYING, nullable)

the SDL file the owning directive application was captured from, carried from graphitron_argmapping_entry; NULL where that application carries no position

source_line (INTEGER, nullable)

source line of the owning directive application, 1-based; NULL exactly where source_name is

source_column (INTEGER, nullable)

source column of the owning directive application, 1-based; NULL exactly where source_name is

intent_argument_filter_role (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. Which rule resolves what one argument contributes to the filter surface of the field it sits on. The argument-grain counterpart of the field-grain claim stratum, and the relation a consumer building a generated WHERE clause reads before it reads any of the rules' own relations, because what it needs first is which of them applies. The classifier’s argument switch is an ordered fork rather than a set of disjoint tests, so this is a ranked collapse and not a union: @orderBy first, then a pagination-role name, then an input-object type, then the node-id decode, then the name match. Stating it as a union would let a @lookupKey-marked @orderBy argument surface twice, and picking either row would be a precedence this relation invented; the rank is the switch’s own order transcribed. Absence is where no rule answers, and every one of those sites is a rejection’s population rather than an argument that quietly contributes nothing: an unresolvable name, a repeated @reference, an @asFacet-style misuse. What the roles mean. ORDER_BY and PAGINATE contribute no predicate at all, the ordering and pagination facts consuming those arguments; PAGINATE reads the four reserved names, which is a generator constant rather than a captured fact and so is stated here in the derivation where the capture doctrine puts such things. INPUT_EXPANSION means the contribution is the argument’s input type’s own fields, resolved at their coordinates and not at this one, so a reader following it changes grain. NODE_ID means the predicate’s columns come from the resolved node key rather than from a name, and the population is the NODE_TYPE rows of graphitron_node_id_instruction rather than the directive: that relation already carries both readings, the authored @nodeId and the implicit one at an ID argument literally named id on a field returning a node type, with the type resolution and every decline it makes already applied. Reading that relation whole is what the kind column ended. An authored @nodeId may name a polymorphic container at a @service slot, so an instruction no longer promises a node type, and the kind predicate is this relation’s own rather than something the instruction relation already applied on its behalf. Restating either rule here was the first draft of this relation and it was wrong twice over, duplicating a rule the store states and getting the implicit one’s reach narrower than the store’s. What this relation adds is the wiring the instruction relation deliberately does not state: an instruction says the decode applies at a site, and whether the classifier can build a filter from it is a separate question with three exits. A @field(name:) binding beside it names two binding axes at once and the site resolves to nothing. On the implicit reading only, a column of that name on the argument’s own scope shadows it into nothing, a composite key without @lookupKey is unwired and resolves to nothing, and a list at arity one without @lookupKey falls through to the name match, which is the one exit that lands on another role rather than on silence. Those three are the implicit reading’s because the authored directive’s equivalents are the decode’s own forks, which graphitron_node_id_instruction and the decode relations below it already answer. Where a named type resolves to no key at all the fork is on the kind and not on the arity. A container is excluded by what it is, ahead of the three exits above: it resolves no key of its own, its members' keys being the decode’s business rather than a column this relation could project. A node type is read as the single-column shape, which is the shape a node has when nothing says otherwise, and no arity this relation could invent would change that. NAME_MATCHED means the predicate compares the column graphitron_argument_column_match resolved, and it covers the @reference-pathed argument and the plain one alike: the two are one rule here because the column resolution already tells them apart, its scope’s basis saying whether the predicate lands on the field’s own table or a join away. It also covers the argument of a multi-table polymorphic root, which it did not before the participant fan-out reached the column resolution: such a coordinate is rooted in one table per branch, the name resolves against each of them, and this relation had no row at all where the classifier lowers a predicate per branch. Which is where the grain of this relation and the grain below it deliberately part. The rule an argument falls under is the argument’s and is the same on every branch, so this stays one row per argument, and the branch-specific answer, which column on which table, is the resolution’s to give; a reader assembling a branch’s filter surface joins the match on the table it is assembling for. That division is the one this relation already declares for the monomorphic case, that it chooses the rule and does not assemble the predicate, and the fan-out only makes the reason visible. Two consequences worth stating rather than leaving to be met. A name that reaches a column on one participant’s table and none on another’s carries NAME_MATCHED here on the strength of the branch that resolved, which is a rejection’s population and reads as one only against the match rows, per the reading of absence this relation already takes. And the implicit node id’s shadowing modifier is an existence test over those same rows, so it reads "shadowed on some branch"; branches disagreeing on it is the same detection over the same pair, not a second vocabulary here. Two columns beside the role are modifiers and not arms, because the classifier treats them that way. lookup_key says the argument is consumed by the keyed lookup instead of the WHERE clause, which it can be on the node-id and name-matched roles alike, so folding it into the vocabulary would have split two roles into four. suppressed says an override cascade suppresses the generated predicate, from @condition(override: true) on the field or on the argument; it is not an absence because a suppressed argument carrying its own @condition still contributes that authored filter, and on an INPUT_EXPANSION row it is the cascade’s starting value for the walk into the input type. What this relation does not state is the predicate itself. Which column, which comparison and which reach are the resolution relations' answers, read through the role; putting them here would make this a filter-surface relation at the wrong grain, an argument being where the rule is chosen and not where the predicate is assembled.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from graphql_argument

type_name (CHARACTER VARYING, nullable)

the type owning the field the argument sits on

field_name (CHARACTER VARYING, nullable)

the field the argument sits on

argument_name (CHARACTER VARYING, nullable)

the argument’s name within the owning field; the grain, one row per argument any rule answers for

role (CHARACTER VARYING, nullable)

which rule resolves the contribution: ORDER_BY, PAGINATE, INPUT_EXPANSION, NODE_ID or NAME_MATCHED, the winner of the ranked fork. A closed vocabulary, and a new classifier arm is a new value here rather than a silence

lookup_key (BOOLEAN, nullable)

@lookupKey on the argument: the value is consumed by the keyed lookup rather than by the WHERE clause. A modifier on the role and not a role, because the classifier reads it inside several arms rather than instead of them

suppressed (BOOLEAN, nullable)

an override cascade suppresses the generated predicate: @condition(override: true) on the field or on the argument. Not an absence, an argument carrying its own @condition still contributing that authored filter; on an INPUT_EXPANSION row it is what the walk into the input type starts from

source_name (CHARACTER VARYING, nullable)

the argument’s own declaration file; the position a diagnostic would carry

source_line (INTEGER, nullable)

source line of the argument declaration, 1-based

source_column (INTEGER, nullable)

source column of the argument declaration, 1-based

intent_argument_reference_step_hop (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. One argument-site @reference path element’s local resolution: the field-site sibling’s rule at the other coordinate a @reference can be written on. Every arm, every namespace precedence and every orientation is that view’s, and its comment is where they are argued; what differs here is only the relation the elements come from and the key they are keyed by, an argument being its own site. A sibling relation rather than an argument_name column on the field-site view, on the discipline intent_input_occurrence_path_step states for its own shape: the two sites' coordinates are different lengths, so one relation over both would carry a column that is NULL by kind on half its rows and every reader of either site would then have to say which kind it meant. Two relations say it once each. The duplication is the rule’s statement and not the rule, which is the trade this schema makes wherever a rule is coordinate-shaped. The two statements are no longer comparable as text: the field-site hop is the two jOOQ statements FieldReferenceStepHops runs into two keyed tables, and this one is a view, so the anchor test asserting that the two answer the same path shape the same way is the whole of what keeps them in agreement rather than a check on something a reader could also see. Where a resolution genuinely is shared it is already a relation of its own and both views join it, graphitron_spelled_table for a written table name, sql_name_matched_key_column for a function result’s column pairing and graphitron_condition_method_route for the route a condition method’s signature declares, so what remains here is the coordinate-shaped part alone. Separate from graphitron_argument_reference_step_target for the reason its field-site counterpart is: the local resolution has no recursion in it, and keeping the two apart lets that view’s recursive term be a single join rather than a copy of these arms. A view rather than a stage beside the walk that reads it, and that is a measurement rather than a reading of the shape. The walk names this relation in its recursive term, which is the position that re-expands a view once per accumulated row, and its arms are a four-way union over the catalog where the field-site hop is two keyed tables, so the asymmetry is real. Measured on a capture of the example schema, 915 fields and 305 arguments, eleven argument-site path elements, eighteen rows here, three sweeps with result reuse off: this relation alone visits 2870 rows in 4 to 5 milliseconds, and each of the walk’s two arm statements visits about 3010 in 10 to 12 with this relation a view, against about 175 in 3 with it snapshotted into a table, the snapshot filling in 6. So the recursion expands it about once rather than once per row, the chains there being eight, three of them two elements long and none longer, and storing it would buy about fifteen milliseconds a capture. A consumer whose argument paths run several elements deep is where that reading changes, and the reading to repeat there is the same pair.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from graphitron_argument_reference_step_entry

type_name (CHARACTER VARYING, nullable)

the type owning the field the argument sits on

field_name (CHARACTER VARYING, nullable)

the field owning the argument the @reference is applied to

argument_name (CHARACTER VARYING, nullable)

the argument the @reference is applied to; the coordinate column the field-site sibling does not have, and the reason this is its own relation

ordinal (INTEGER, nullable)

the owning @reference application’s ordinal. Carried for parity with the field-site sibling and with the captured relation’s own key, not because an argument composes a chain: repeated @reference on an argument is a stated conflict rather than an ordered composition, order having no meaning at a site that is not a projection

position (INTEGER, nullable)

the element’s 0-based position within its application’s path

via (CHARACTER VARYING, nullable)

which arm resolved the element: KEY, TABLE, NAME_MATCH or CONDITION, as on the field-site sibling

key_matched_by (CHARACTER VARYING, nullable)

for a KEY hop, which namespace answered: SQL_NAME or JOOQ_NAME. NULL on a TABLE, NAME_MATCH or CONDITION hop, as on the field-site sibling

from_source_name (CHARACTER VARYING, nullable)

the departing table’s catalog partition, first column of its sql_table key

from_schema (CHARACTER VARYING, nullable)

the departing table’s SQL schema

from_table (CHARACTER VARYING, nullable)

the departing table’s SQL name; a candidate departure, not yet a fact about the chain

to_source_name (CHARACTER VARYING, nullable)

the arriving table’s catalog partition, first column of its sql_table key

to_schema (CHARACTER VARYING, nullable)

the arriving table’s SQL schema

to_table (CHARACTER VARYING, nullable)

the arriving table’s SQL name

constraint_name (CHARACTER VARYING, nullable)

the foreign key the hop joins on, named or discovered; NULL on a NAME_MATCH or CONDITION hop, as on the field-site sibling

fk_on_from (BOOLEAN, nullable)

TRUE when the departing table declares the foreign key, FALSE when the arriving one does; NULL on a NAME_MATCH or CONDITION hop, as on the field-site sibling

intent_authored_claim_conflict (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. The authored-claim conflict rule as a resident of the intent_ stratum: one row per violated coordinate, both grains, the store-native pilot of the diagnostics stratum’s derivation arms. A coordinate violates when two or more distinct classifiers claim it, and that is the whole predicate: the relation is total over the authored claims and carries no population filter of its own. An authored contradiction is a contradiction wherever it sits, so each consumer applies the population its own question needs (the build-error surface joins intent_type_domain, type grain directly and field grain through the claim’s owning type, because only the emitted surface can fail a build; the editor’s diagnostic arm reads these rows ungated, a type no field reaches being precisely where an author most needs the signal). What this relation does not carry is any accept line: a filter wearing the view’s name would substitute one consumer’s population for the fact. Nor does it carry the claiming directives or the violation’s message. The claims are rows on the two claim views under this relation’s own key, so a consumer wanting their names joins them and asks membership as well as set equality; the message is a render whose naming order is AuthoredClaim’s declaration order, which is not a captured fact and so is no view’s to express, and it is minted post-capture into intent_authored_claim_rejection instead. One piece of Java logic still lives in this SQL and is pinned by the registered agreement anchor (no.sikt.graphitron.rewrite.derive.AuthoredClaimConflictsTest): the routine-plus-lookup carve-out, exactly that claim pair being the recognised-but-unsupported combination, which yields DEFERRED instead of CONFLICT. Locations join as the legacy mint did: a field violation carries the field’s own declared position, a type violation the type’s base declaration site at merge ordinal 0.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from the claim views

type_name (CHARACTER VARYING, nullable)

the violated coordinate’s owning type (the coordinate itself at the type grain)

field_name (CHARACTER VARYING, nullable)

the violated coordinate’s field name; NULL exactly on type-grain rows, which is what a union over two grains costs in a key

verdict (CHARACTER VARYING, nullable)

CONFLICT for mutually exclusive claims, DEFERRED for the recognised routine-plus-lookup pair; a closed two-value vocabulary the reduction’s own output type discriminates

source_name (CHARACTER VARYING, nullable)

the violated coordinate’s own declaration file (the field’s position at the field grain, the base declaration’s at the type grain); NULL where the declaration carries no position

source_line (INTEGER, nullable)

source line of the violated coordinate’s declaration, 1-based

source_column (INTEGER, nullable)

source column of the violated coordinate’s declaration, 1-based

intent_authored_claim_rejection

The rejection each row of intent_authored_claim_conflict mints, minted post-capture rather than derived: one row per violated coordinate, carrying the sealed Rejection hierarchy’s verdict on it and the message a report would print. For example a field two directives each claim to produce draws one row, at the ordinal its conflict was minted in, carrying the message a build report prints.

Primary key: (graph_name, ordinal). Foreign key: (graph_name) references store_graph (graph_name). Check: "KIND" IN('INVALID_SCHEMA', 'DEFERRED').

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

ordinal (INTEGER, not null)

mint order over the graph’s violated coordinates, 0-based; the key’s tie-breaker on rejection_validation_error.ordinal’s convention, which this relation needs because its natural key is the coordinate pair and that pair carries a NULL at the type grain where a key may not

type_name (CHARACTER VARYING, not null)

the violated coordinate’s owning type, joining intent_authored_claim_conflict’s own

field_name (CHARACTER VARYING, nullable)

the violated coordinate’s field name; NULL exactly on type-grain rows, the two-grain shape the conflict view is keyed by

kind (CHARACTER VARYING, not null)

RejectionKind.name() for the minted rejection, a closed CHECK over the two values this family can reach: INVALID_SCHEMA for the mutual-exclusivity conflict, DEFERRED for the recognised routine-plus-lookup pair. Minted rather than mapped from verdict in SQL, because the projection is RejectionKind’s and a CASE restating it here would be a second copy of a fork the hierarchy already owns

variant (CHARACTER VARYING, not null)

the minted rejection leaf’s class name with its package stripped, enclosing classes kept, on rejection_validation_error.variant’s spelling rule and through the same one Java site, so the two relations cannot spell one family two ways and a rename cannot leave a stale spelling behind

message (CHARACTER VARYING, not null)

the violation’s full report message, coordinate prefix included, byte-identical to what the report carries for this family (the agreement anchor pins the spelling); display material, never a dimension

intent_authored_field_claim (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. The author’s field-grain classification claims. One arm pair per claiming directive (@service, @externalField, @nodeId, @lookupKey, @routine, @mutation): the decoded arm reads the semantic relation, the presence arm falls back to the raw application where the decode declined. The per-arm type_name masks transcribe the walk’s per-position detector gates: @service claims at every position, @externalField and @nodeId nowhere on a root, @routine not on Mutation or Subscription (a Mutation @routine is the walk’s own typed deferral, never a conflict slot), @lookupKey only on Query, @mutation only on Mutation. The @lookupKey arm fires on the whole argument surface, matching LookupFacts.triggersFor: a directly marked argument, or an argument whose named type is in the transitive lookup-bearing input closure (the recursive path-guarded closure above, seeded from the retired input-field site, so on accepted schemas the recursion never expands). That closure recurses over input_object_field_edge, the field edges deduplicated to the pairs they denote, and not over graphql_field: the hop joins on the named type and projects the declaring type, so two fields of one named type are identical output rows that UNION ALL keeps and re-expands at the next hop, doubling the frontier per level of input-object nesting. Consumption is through EXISTS, so deduplicating the edges changes no answer. The @routine arms collapse the repeatable ordinal grain to the minimum-ordinal application’s row.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried through from every arm’s base relation

type_name (CHARACTER VARYING, nullable)

the claimed field’s owning type

field_name (CHARACTER VARYING, nullable)

the claimed field’s name within the owning type

classifier (CHARACTER VARYING, nullable)

the classification kind the claim is for; a closed vocabulary the reading side decodes into a typed value (SERVICE, EXTERNAL_FIELD, NODE_ID, LOOKUP_KEY, ROUTINE, MUTATION), separate from the trigger because a derived claim may have no directive at all

trigger (CHARACTER VARYING, nullable)

the claiming directive’s name, without the leading @; what a conflict message names

decoded (BOOLEAN, nullable)

TRUE from a semantic-relation arm; FALSE from a presence arm, meaning the application exists but its decode declined

source_name (CHARACTER VARYING, nullable)

the claiming application’s own position; NULL on a closure-triggered @lookupKey claim, whose application sits on a remote input field

source_line (INTEGER, nullable)

source line of the claiming application, 1-based

source_column (INTEGER, nullable)

source column of the claiming application, 1-based

intent_authored_type_claim (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. The author’s type-grain classification claims: @table and @error, decoded arm plus presence fallback each, with the root names masked out (transcribing the walk’s root short-circuit, which classifies a root before any type directive is read). That a conflict here can only occur on an OBJECT is guaranteed upstream by assembly (@error is declared on OBJECT), the same assembly dependency graphitron_undecoded_argument_entry records; a lone @table claim on an INPUT_OBJECT or INTERFACE is an honest single claim that conflicts with nothing. The applications sit at the type grain even when applied on an extension site; the presence arms collapse a base-plus-extension double application to the minimum-ordinal row.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried through from every arm’s base relation

type_name (CHARACTER VARYING, nullable)

the claimed type

classifier (CHARACTER VARYING, nullable)

the classification kind the claim is for; a closed vocabulary the reading side decodes into a typed value (TABLE, ERROR), separate from the trigger because a derived claim may have no directive at all

trigger (CHARACTER VARYING, nullable)

the claiming directive’s name, without the leading @; what a conflict message names

decoded (BOOLEAN, nullable)

TRUE from a semantic-relation arm; FALSE from a presence arm, meaning the application exists but its decode declined

source_name (CHARACTER VARYING, nullable)

the claiming application’s own position file

source_line (INTEGER, nullable)

source line of the claiming application, 1-based

source_column (INTEGER, nullable)

source column of the claiming application, 1-based

intent_bound_table (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. Which catalog table an @table-bearing type is bound to: graphitron_table_entry’s reference resolved through graphitron_spelled_table, one row per candidate table. The reference is the name argument as written, or the type name where the argument was omitted, which is the derivation graphitron_table_entry.table_ref’s own comment defers; how a spelling then meets the census is the spelling view’s rule, stated once there and not restated here. What this view adds over that one is the keying: a type, not a string, which is what every reader of a binding actually holds. The three root names are masked, transcribing the walk’s root short-circuit that classifies a root before any table binding is read, which is the same mask the authored type claims carry. A base derivation rather than a resolved_ reduction: it stands directly on a transcription pair and nothing reduces over sibling views to produce it. It is one arm of such a reduction, graphitron_resolved_type_binding coalescing it with the binding a @routine chain’s return derives, and that is where a reader asking which table stands for a type points; this relation answers the narrower question of what the author wrote @table for, which is what an editor locating a written site and any reader of the directive population itself asks. Ambiguity is rows, never a decline: two candidates are two rows and the count says so, so a reader can transcribe the walk’s Ambiguous verdict (require candidates = 1, as the column-match classifier does), offer every candidate (as an editor does, since each is a table the author might mean), or report the ambiguity, without any of them re-spelling the resolution. The reference as written and the application’s position are one join back to graphitron_table_entry, which holds both.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from graphitron_table_entry

type_name (CHARACTER VARYING, nullable)

the @table-bearing type whose binding this row resolves

table_source_name (CHARACTER VARYING, nullable)

the resolved table’s catalog partition, the first column of the sql_table key this row names

table_schema (CHARACTER VARYING, nullable)

the resolved table’s SQL schema; what tells two candidates of one name apart

table_name (CHARACTER VARYING, nullable)

the resolved table’s SQL name. With the two columns above this is sql_table’s full key; the table’s other facts (its jOOQ name, its generated class, its comment) are one join away, per the referenced-side discipline sql_referential_constraint states

candidates (INTEGER, nullable)

how many tables the reference resolves to, this row being one of them; 1 on an unambiguous binding. Carried through from the spelling view rather than recounted here, and stated as a column rather than left to each reader’s own count, because whether a binding is ambiguous decides the reading (a claim declines, an editor offers every candidate) and a reader that counted for itself would be re-deriving the resolution’s own arity

intent_carrier_routine_hop (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. The hop a routine write’s payload carrier takes to re-read its committed row, for a data field that declares no path. A @routine write on a mutation root may return a payload wrapping one data field beside an error channel; the routine call is the write, and the data field owns the post-commit re-read. That hop is inferred from the payload’s shape rather than written, which is precisely why graphitron_field_reference_step_hop holds no row for it: that relation’s population is authored path elements, and this coordinate authors none. So the same keying rule is reached from two relations, and it lives in neither of them. This one states the two ends and joins sql_name_matched_key_column for the pairing, exactly as the authored arm does, and for the reason the referenced-side discipline gives: the pairs are reachable from the triples this row already carries, and repeating them here would be a denormalisation. The departure is the routine the producing mutation field names, resolved as any written table name is and then required to be FUNCTION-typed. The arrival is the data field’s own named type’s binding, demanded unambiguous, an arrival that is not certain not being the one the re-read would run against. The producing field is required to carry no @reference, which is not a narrowing but the carrier’s own boundary: the chained form returns the terminus table type and has an authored element to resolve through, and @routine with @reference over a carrier return is rejected outright, so a row here would name a hop the generator will not emit. Ambiguity is rows, and here it is a real one the generator currently hides: two mutation fields returning one payload are two candidate departures, where the grounding memo keeps whichever field classified first. Absence covers several things and none of them is "this carrier has no hop": the payload is not a carrier, or its element is not table-backed, or its data field’s type binds ambiguously, or the routine name resolves to nothing FUNCTION-typed. One narrowness is inherited rather than chosen. The element_kind gate is graphitron_carrier_data_field’s, and that relation reads the @table population alone where this one reads the resolved binding, so a data field whose type is bound only by being what a routine returns is excluded upstream of here; the gate follows that relation when it moves, rather than this one reading past it.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from the carrier relation

type_name (CHARACTER VARYING, nullable)

the payload type the producing mutation field returns; the carrier whose data field this hop serves

field_name (CHARACTER VARYING, nullable)

the data field within that payload: the coordinate the re-read runs at, and the one an author would hang a path on if the data field admitted one

from_source_name (CHARACTER VARYING, nullable)

the routine result’s catalog partition; the departure, resolved from the producing field’s @routine(name:) through the spelling view

from_schema (CHARACTER VARYING, nullable)

the routine result’s SQL schema

from_table (CHARACTER VARYING, nullable)

the routine result’s SQL name, FUNCTION-typed by construction. With the two columns above this is the departing side of the pairing relation’s key

to_source_name (CHARACTER VARYING, nullable)

the arriving table’s catalog partition; the data field’s named type’s binding, demanded unambiguous

to_schema (CHARACTER VARYING, nullable)

the arriving table’s SQL schema

to_table (CHARACTER VARYING, nullable)

the arriving table’s SQL name, the row the write committed and the re-read fetches. With the two columns above this is the arriving side of the pairing relation’s key

candidates (INTEGER, nullable)

how many departures this data field’s hop could leave from, this row being one of them; 1 where one mutation field produces the payload. Above 1 is two producing fields naming different routines, which the generator resolves by first-producer-wins without saying so, and which this column says

intent_column_match_claim (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. The column-match structural classifier: a field whose name resolves against the table its site navigates to claims TABLE_COLUMN, no directive involved. Usually that is the parent’s own bound table, and where an authored @reference path moves the site it is the path’s terminal, which graphitron_field_column_scope answers for both and this view no longer decides for itself. One view per structural classifier, so the row’s columns are exactly this classifier’s join witnesses. The reading transcribes the classification walk’s fall-through arm: the field’s named type has kind SCALAR or ENUM, the site resolves against exactly one table (the resolution is graphitron_field_column_scope’s, which requires a single candidate on its parent-binding rule and so is how this arm transcribes the walk’s Ambiguous verdict; distinguishing that decline from a name not in the catalog at all is a future resolution-stratum detection over graphitron_table_entry, not something this view’s absence encodes), and the effective name matches a column, generated-Java-name tier before SQL-name tier, both case-insensitive, collapsed to the first match in tier-then-ordinal order. The effective name is the @field binding where one decoded, else the field name; the arm needs no undecoded presence fallback because a declined @field decode leaves the COALESCE on the field name, which is the walk’s own fallback. The scope drives the join and that is load-bearing rather than stylistic: H2 re-evaluates a joined derived relation once per outer row, so reading the scope from underneath graphql_field costs the whole relation per candidate field and measured seventy times this shape on a store holding a dozen graphs. Any relation joining a derivation this deep wants the derivation first in the FROM clause. Deliberately mask-light: the only exclusion is the three root names, and it arrives through the scope view’s own binding read rather than being restated here, roots classifying before any table binding is read. The scope’s parent-binding rule is mask-light for the same reason, so a coordinate an authored directive claims still produces the structural reading here and the reduction is what drops it. No parent-kind gate and no directive knowledge: masking against authored claims is the reduction’s job, and the raw structural reading surviving here is what lets a diagnostic say "would classify as a table column; @service overrides it".

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from graphql_field

type_name (CHARACTER VARYING, nullable)

the claimed field’s owning type

field_name (CHARACTER VARYING, nullable)

the claimed field’s name within the owning type

classifier (CHARACTER VARYING, nullable)

always TABLE_COLUMN; stated as a column so claim views union at the classifier grain

matched_name (CHARACTER VARYING, nullable)

the effective name the classifier resolved: the @field binding where one decoded, else the field name. The classifier’s own product rather than a projection of either input, which is what earns it a column here

matched_by (CHARACTER VARYING, nullable)

which tier matched: JOOQ_NAME (the generated Java field name) or SQL_NAME. Makes the two-tier precedence visible data instead of a hidden pick

table_source_name (CHARACTER VARYING, nullable)

witness: the resolved table’s catalog partition, the first column of the sql_column key this row names

table_schema (CHARACTER VARYING, nullable)

witness: the resolved table’s SQL schema

table_name (CHARACTER VARYING, nullable)

witness: the resolved table’s SQL name

column_name (CHARACTER VARYING, nullable)

witness: the matched column’s SQL name. With the three columns above this is sql_column’s full key; the column’s other facts (its jOOQ name, type, nullability) are one join away, per the referenced-side discipline sql_referential_constraint states

source_name (CHARACTER VARYING, nullable)

the claimed field’s own declaration file; the position a diagnostic would carry

source_line (INTEGER, nullable)

source line of the field declaration, 1-based

source_column (INTEGER, nullable)

source column of the field declaration, 1-based

intent_condition_membership (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. Which tables a coordinate contributes a WHERE clause against, one row per coordinate and table. The condition family’s membership fold: a consumer minting the generated filter glue reads this to know which glue exists, and every other relation in the family answers a question about a row this one admits. Membership is presence and nothing else, which is what makes it a fold rather than a payload: what the predicates are, which columns they compare and which arguments carry them are the resolution relations' answers, read through this one. The rule is that the coordinate’s lowered filter surface is nonempty, and it is nonempty when any of five sources contributes. Three are authored and cannot be suppressed, a @condition being a method the author wrote and asked to have called: one on the field itself, one on any argument of it whatever that argument’s role, and one on any input field the field’s arguments reach at any depth. Two are generated and can be: an argument whose role resolves a predicate, and an input field whose role does. The generated pair is where the modifiers matter, and they are read at the grain the classifier reads them at. An argument contributes only when its role is one that resolves a predicate, which is NODE_ID or NAME_MATCHED and not the four that resolve something else; ORDER_BY and PAGINATE are consumed by the ordering and pagination facts, and INPUT_EXPANSION contributes nothing of its own, the contribution being the fields below it, which arrive here as the input-field sources instead. An input field contributes under the same two roles, and additionally not when the override cascade suppresses it, which is intent_input_occurrence_override read at the occurrence rather than at the field, and not when a @lookupKey consumes it. That last exclusion propagates: a @lookupKey on the argument consumes the whole expansion beneath it, so an occurrence under such an argument contributes nothing at any depth, which is a rule about the argument applied at the grain of the field under it. Four kinds of coordinate are excluded outright because their filter surface is not a filter surface. A mutation’s predicates come from the write partition and not from here, and the write payload argument that would otherwise read as a filter is the largest part of what that exclusion removes. A @service field generates no SQL at all. The relay node field resolves a node and never filters, its shape carrying the node-resolve member and no condition member however its id argument classifies. And an argument consumed by a keyed lookup is the VALUES-and-join path rather than the WHERE clause. Each is stated as its own exclusion rather than folded into one predicate, because they are four different reasons and a reader debugging a missing row wants to know which one fired. The table side is graphitron_field_scope_table at its own grain, which is why that relation’s grain had to be corrected before this fold could exist: a @condition on a field with no arguments has a table to filter and no argument to carry it. A multi-table polymorphic root gets one row per branch here for free, that relation carrying a PARTICIPANT_TABLE row per participant table, and the branch fan-out is therefore the scope table’s and not this relation’s. Membership itself stays a property of the coordinate: a name that resolves a column on one participant and not on another is a build failure at that participant rather than a membership difference between branches, so the fold has nothing to decide there and deliberately does not fan the sources out. A consumer minting the per-participant glue method, whose name is the participant’s, joins intent_field_participant_scope_table on the table. Three populations are missing from this relation and each is measured rather than supposed. The store has no read-side refusal: a coordinate whose argument classification fails is refused whole and has no filter surface at all, and where the write partition states its refusals in two relations of their own the filter surface states none, so a refused coordinate has a row here that no consumer will find glue for. On a schema that builds, that population is empty, every refusal being a build failure; it is the fold’s one structural gap and closing it is a relation of its own. One more is a silence one rung up, found by diffing this relation against what the producer emits for the example schema and filed: a field returning an author-declared connection type has no scope row, so a coordinate whose only table would come from that row contributes nothing here that the generator does contribute. That diff is no longer run by hand. no.sikt.graphitron.rewrite.derive.ConditionMembershipShadowTest holds this relation’s key set against what the producer yields, so a population that goes missing announces itself as a failing test with the coordinate named rather than as a count in this sentence that nothing recomputes; it retires with the walk when the producer reads the fold. The sibling silence that sentence used to carry, an argument whose @reference path ends in a condition hop resolving no column, is closed: such a path resolves through graphitron_condition_method_route and lands a column scope like any other. Absence otherwise is every coordinate that reads no table, every coordinate whose arguments all resolve to something other than a predicate, and every coordinate whose generated predicates are all suppressed while it carries no authored condition to fall back on.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from the contributing source; the leading key dimension that keeps one workspace’s graphs apart

type_name (CHARACTER VARYING, nullable)

the type owning the filtering field

field_name (CHARACTER VARYING, nullable)

the field whose filter surface this row admits; with the type above and the table below, the grain, and the same key the condition command relation is keyed by

basis (CHARACTER VARYING, nullable)

which rule resolved the table, carried from graphitron_field_scope_table unchanged: NAMED_TYPE_TABLE, PAYLOAD_TABLE, MUTATION_TABLE or PARTICIPANT_TABLE. PARTICIPANT_TABLE is the one that changes what a consumer does with the row, marking it one branch of a polymorphic root rather than a coordinate’s whole statement, and so deciding which glue method name is minted; the other three are provenance

table_source_name (CHARACTER VARYING, nullable)

the filtered table’s catalog partition, the first column of the sql_table key this row names

table_schema (CHARACTER VARYING, nullable)

the filtered table’s SQL schema

table_name (CHARACTER VARYING, nullable)

the filtered table’s SQL name; with the two columns above this is sql_table’s full key, so the table’s own columns are one join away

intent_condition_param_decode (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. Where a @condition parameter bound to a slot is exempted from the declared-type extraction rule and receives the slot’s decoded node key instead, and what shape that key has. The override half of a pair: code_method_parameter.extraction states the standing rule by declared type, this states the exception, and presence here is the whole of what says the exception applies. Absence is not a silence; it is the assertion that the declared-type rule stands at that coordinate, which is the shape the fact model uses wherever a rule has an exception rather than a variant. The population is every slot carrying the @nodeId instruction that a @condition names a class and a method at, and a slot is named two ways: by its own directive, and by a directive on the field whose arguments it is one of. So the arms are three where the slot sites a value is bound from are two, an argument and an input field. Each arm reads its directive at the coordinate capture wrote it to: an argument condition at the three-part coordinate, an input-field condition at the shared field coordinate with the owning type’s kind INPUT_OBJECT, and a field-level condition at that same shared coordinate with the kind an object or an interface, the slots it sees being its field’s own arguments. They are one relation because they are one rule: the generator installs the decode keyed on the slot, so a parameter bound to a @nodeId argument receives the decoded key however the directive binding it was written, and an arm missing here would assert the declared-type rule stands at a coordinate where it does not. Keyed by the method as well as by the coordinate, for the reason the third arm makes visible: one argument can be named by its own @condition and by its field’s at once, and those are two authored methods each receiving the decoded key, so class_name and method_name complete the key rather than riding as payload of the coordinate. Two directives naming one method at one coordinate stay one row, which the third arm’s anti-join is what says: the exemption is a fact about a slot and a method, and a second directive asserting it again adds no fact. Use-keyed, and that is the point of it being separate: the rule the extraction relation states is a fact of a signature and the same signature written at two sites is one row there, while this is a fact of a site, so one method named by a @nodeId-bound slot at one coordinate and a plain scalar at another is one row here and not two answers on one method-keyed row. The coordinate it carries is graphitron_node_id_instruction’s own, so a reader holding a use site joins straight across; the instruction relation’s multiplicity is inherited whole, one row per consuming coordinate for an input field and one row for an argument. What this relation does not say is which of the method’s parameters receives the decoded key. That is the binding question the fact model defers everywhere: which parameter takes an argument, which takes the source table and which takes a context value is decided per directive application from the slots and the context keys in scope, and code_method_parameter’s own comment defers it for the same reason. A reader that has resolved the binding for itself, which the editor and the validator both have, reads the shape here and needs nothing further; a reader that has not cannot get it from this relation and must not read the row as naming a parameter. The shape is stated as an arity and a list flag rather than as a Java type, because the type is the generator’s composition of two facts a reader already has: the key columns' own types, at graphitron_node_keycolumn’s grain, and the wrapping this relation names. An arity of one means the key column’s own type, above one means the typed jOOQ Row of the key columns in key order, and list_valued wraps either. Spelling the composed type here would be a second statement of a convention that lives in generated code, and it would go stale against a column type change this relation cannot see. Population boundary, since a hole reads as an exemption that does not apply: a slot whose node type resolves no key columns has no row, the arity join being what excludes it, and that coordinate already meets a shipped rejection naming the type rather than needing a row here to be silent about. A parameter reached by a dotted argMapping into the key columns of the same slot is a different mechanism at a different grain, the projection rail’s, and is not this relation’s exemption; the two do not overlap because a dotted binding is not a whole-slot binding.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from the instruction the row is about; the leading key dimension that keeps one workspace’s graphs apart

site (CHARACTER VARYING, nullable)

which SDL site carries the slot, in a closed vocabulary of two: ARGUMENT and INPUT_FIELD. Narrower than graphitron_node_id_instruction.site’s three by construction, an output field binding no value into a condition method; the column every other column’s nullness is determined by, on that relation’s terms. The slot’s site and not the directive’s, which is why two of the three arms land ARGUMENT: a field-level @condition is written at a field and binds that field’s arguments, so what it exempts sits at an argument like the argument’s own directive does

type_name (CHARACTER VARYING, nullable)

the GraphQL type owning the slot’s field: the object type at an argument, the input object type at an input field

field_name (CHARACTER VARYING, nullable)

the field name within the owning type

argument_name (CHARACTER VARYING, nullable)

the argument the slot is, where the site is an argument; NULL at an input field, on graphitron_node_id_instruction.argument_name’s terms

path (CHARACTER VARYING, nullable)

the occurrence path reaching the slot, where the site is an input field; NULL at an argument, on graphitron_node_id_instruction.path’s terms

use_site (CHARACTER VARYING, nullable)

the consuming coordinate this row is about, carried whole from graphitron_node_id_instruction.use_site so a reader holding one joins straight across. Part of the key, and what makes this relation use-keyed rather than method-keyed

class_name (CHARACTER VARYING, nullable)

the condition class as the author wrote it, fully qualified; the same spelling code_method_parameter.class_name carries, so a reader holding one row of each is holding two statements about one method. Part of the key with the method beside it, one argument being nameable by its own @condition and by its field’s at once

method_name (CHARACTER VARYING, nullable)

the condition method name as the author wrote it, completing the key with the class beside it. No descriptor there, unlike code_method_parameter: this row is a statement about a slot and not about a signature, and every overload a name resolves to receives the same decoded key at this coordinate

node_type_name (CHARACTER VARYING, nullable)

the node type the slot’s instruction resolved, carried from graphitron_node_id_instruction.resolved_type_name; what the decode is a decode of, and the type whose key columns graphitron_node_keycolumn lists. A node type and not a container, which the arity join is what enforces rather than a predicate here: a container resolves no key columns, so a slot whose typeName: names one draws no row on any of the three arms, which is the silence the view comment discloses

key_arity (INTEGER, nullable)

how many key columns the node type resolved, one or more. One means the bound parameter receives the key column’s own Java type; above one means the typed jOOQ Row of the key columns in key order. Never zero: a slot whose node type resolves no key columns is not a row at all, that coordinate meeting a shipped rejection instead

list_valued (BOOLEAN, nullable)

whether the slot is list-shaped in the SDL, read off the slot’s own captured declaration. The wrapping applied over the shape key_arity names, and carried rather than derived because list-ness is a fact of the slot and the arity is a fact of the node type; the two are independent and a reader needs both to name the parameter type

intent_condition_slot (view)

One GraphQL slot in scope at one application of a @condition: one row per argument or input field a parameter of the named method may bind there. For example a field condition on films(rating: String, first: Int) draws two rows, one per argument, while a condition written on the rating argument itself draws only that one.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from the method reference; the leading key dimension that keeps one workspace’s graphs apart

site (CHARACTER VARYING, nullable)

which condition spelling the application is, in graphitron_method_reference_entry.site’s own vocabulary; part of the key, and what decides which arm drew the row

use_site (CHARACTER VARYING, nullable)

the application spelled as one string, in the spelling graphitron_method_reference_entry.use_site and graphitron_argmapping_entry.use_site already use

slot_name (CHARACTER VARYING, nullable)

the slot’s own name, completing the key: the argument name on an ARGUMENT row, the input field’s name on an INPUT_FIELD row. This is the name a parameter matches to bind by identity, and the name an argMapping head segment names

slot_kind (CHARACTER VARYING, nullable)

ARGUMENT or INPUT_FIELD, saying which relation declared the slot: graphql_argument at a site whose slots are a field’s arguments, and graphql_field at an input-field site. A closed two-value vocabulary, the arms of this view being the whole of what can produce a slot

container_type_name (CHARACTER VARYING, nullable)

the type owning the coordinate the directive sits on, carried so the slot’s declaration is one join away

container_field_name (CHARACTER VARYING, nullable)

the field owning the coordinate: the field the argument belongs to on an ARGUMENT row, the input field itself on an INPUT_FIELD row

named_type (CHARACTER VARYING, nullable)

the slot’s named type with every wrapper stripped, as the declaring relation spells it

non_null (BOOLEAN, nullable)

whether the slot’s outermost wrapper is non-null

is_list (BOOLEAN, nullable)

whether the slot is list-shaped, which is what a depth-1 descent refuses to walk through

item_non_null (BOOLEAN, nullable)

whether a list slot’s items are non-null; NULL where the slot is not a list

intent_delivery_container (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. The classes a declared type delivers something through rather than delivers: the container vocabulary the peel descends, one row per class with the type-argument position its element sits at. Named data rather than a predicate spelled inside its reader, and its own relation because the peel reads it twice, once to descend and once to ask whether a position can descend at all. A rule that decides which classes are containers is exactly the kind that must have one home. They are named rather than recognised through a closure over the declared supertype relation because such a closure cannot answer here: nothing ships the JDK as a classpath entry, so java.util.List declares nothing the census holds and standing in for it is unreachable from below. The set is closed by what a generator meets rather than by what Java offers, so a consumer returning its own collection type is not a container here and delivers itself; widening it is adding a row.

Columns
container_class (CHARACTER VARYING, nullable)

the fully-qualified binary name of the container class, spelled as the census spells a class name

element_index (CHARACTER VARYING, nullable)

the 0-based type-argument position the delivered element sits at, as a type_path step: 0 for the single-argument containers, 1 for a map, whose key is not what it delivers

multiplies (BOOLEAN, nullable)

whether passing through this container makes the delivery many rather than one. A collection multiplies and a wrapper does not, which is why the two live in one relation rather than two: both are stepped through by the same descent, and only what the step means to cardinality differs. A map is the case worth stating, and it is FALSE: a map from a key to one value delivers one, and a map from a key to a list delivers many because of the list, so the map itself is transparent and the descent through it decides nothing.

intent_errors_field (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. Which field of a type is an error channel: a nullable list of a polymorphic type whose every member carries @error. One row per such field, total over them, and a field’s shape alone decides it, so this says nothing about whether any producer routes errors into it; a type nobody returns has its errors field named here exactly as a payload’s does. That is deliberate and it is what lets the relation be shaped by the field rather than by the producer, which is the difference between stating a fact and stating one reader’s question. The shape is four conditions and every one of them is the walk’s own. The list must be nullable because a non-null list would raise a non-nullable-field error on the success arm, where the channel resolves to no list at all, and take the sibling data field down with it. The named type must be a union or an interface, a single @error type not being a channel: the dispatch table the channel drives is a choice among mapped types and there is nothing to choose. Every member must carry @error, one that does not making the container a mixed result type rather than an error list. And an @asConnection field is excluded, its wrapper being a Connection rather than a list, so the shape it presents to a channel reader is not the one it presents to graphql-java. The container’s members in their order are intent_errors_field_member, a child rather than a column here because a list is rows; the count of them is that relation’s to answer and not a number stored beside its own rows. This was the errors_field CTE inside graphitron_carrier_data_field, promoted on the second reader: the carrier scan asks which of a payload’s fields are not data channels and the error channel asks which one is the channel, and two readings of one shape is where a fact model puts a relation. Where a payload declares more than one errors-shaped field the walk takes the first in declaration order; this relation names all of them and carries the ordinal that decides, the picking being intent_field_error_channel’s. Not materialized, and the registration it carried was retired once the rule stopped being expensive. Two arguments retired it and only one is about time. On the clock the registration cost 0.21 s of refresh per capture and its one registered reader’s refresh rose 0.12 s without it, so holding it was dearer than not, by a margin this schema’s harness cannot resolve from noise. What decides it is the other cost, which no timing of the registered arm can show: a materialized target is a table with statistics of its own, so every planner decision above it bottoms out there, and the rule underneath becomes invisible to the planner and to anyone reading a plan. That is not hypothetical here. This relation’s own cost was a window function in intent_poly_member, five and a half seconds of it, and it sat unseen behind this registration until the register was emptied to look. A registration that is not paying for itself is not neutral, it is a blindfold over whatever is underneath it.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

type_name (CHARACTER VARYING, nullable)

the type declaring the field; a payload or carrier where a producer routes into it, and any type at all where none does

field_name (CHARACTER VARYING, nullable)

the errors channel’s field name within its type; the coordinate an author’s cursor sits on

ordinal (INTEGER, nullable)

the field’s declaration index within its type, carried from graphql_field. Two readings ride it: it is the SDL order that decides which errors-shaped field a payload declaring several routes through, and on the payload-class arm it is also the canonical constructor’s parameter index, records preserving declaration order and hand-rolled payload classes being expected to match it

container_name (CHARACTER VARYING, nullable)

the union or interface the field’s element type names; the container whose members are the mapped @error types

container_kind (CHARACTER VARYING, nullable)

which polymorphic form the container is, a closed two-value domain: UNION, INTERFACE. Carried so a reader need not re-read graphql_type to know which arm of intent_poly_member supplied the members

intent_errors_field_member (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. The @error types one error channel maps, in order: the ordered child of intent_errors_field, one row per member of the field’s container. Every member carries @error, that being a condition of the parent relation admitting the field at all, so this relation needs no error predicate of its own and a row here is always a mapped type. Ordered because the consumers are ordered: the dispatch table is tried in this order, and the fingerprint that disambiguates two channels sharing a constant name is a digest over the flattened handler list in this order, so a re-ordering is a different emitted name and not a cosmetic difference. A child relation rather than a column on the parent because a list is rows; a column holding a serialized member set would answer set equality and nothing else, which is the reading intent_type_backing_conflict declines for the same reason. Keyed by the errors field and not by the container, so two fields naming one union are two ordered lists rather than one shared by reference: that costs rows and buys a reader the ability to join on its own coordinate without knowing the container, and the container is a column on the parent for the reader that would rather group. The handlers each of these types declares are graphitron_error_handler_entry’s, keyed by the type alone, an @error type’s handler list being the type’s property and not this channel’s.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from the errors field

type_name (CHARACTER VARYING, nullable)

the type declaring the errors field, carried from intent_errors_field

field_name (CHARACTER VARYING, nullable)

the errors field these members are the mapped types of

position (INTEGER, nullable)

source order within the container, carried from intent_poly_member; authored on a union and derived from declaration sites on an interface, which that relation states the consequence of

error_type_name (CHARACTER VARYING, nullable)

the @error type at this position; always a captured type carrying @error, the parent relation admitting no field whose container holds anything else

intent_federation_key (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. Every @key a graph’s emitted schema carries, authored and synthesized alike: the composition two readers already ask for, the round trip that re-emits the applications and the agreement anchor that pins the derivation against the pipeline’s registry rewrite. A relation rather than a union each of them assembles for itself, on the rule that a composition with a second asker is a relation. The grain is the authored relation’s, with a NULL ordinal on the synthesized arm rather than an invented one: document order is a property of something the author wrote, and a derived row has no position in a document. UNION ALL and not UNION, deliberately. The authored arm is unique on its own key already and the synthesized arm cannot collide with it, its condition being that no authored id key exists, so deduplication could only ever fold together rows a reader wants told apart: two authored @key(fields: "id") applications at distinct ordinals are two rows here, which is the arity the authored relation states and this reduction owes its readers. Key grain only. The path and segment children stay authored-only until a reader asks for them composed, the synthesized arm’s single id path being recoverable from fields_sdl by the same rule that would have decoded it. A reader wanting a total order over both arms orders the authored rows by ordinal and appends the derived one, which is the ordering the composing query owns rather than one this relation invents.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from whichever arm produced the row

type_name (CHARACTER VARYING, nullable)

the type the key sits on

ordinal (INTEGER, nullable)

the authored application’s position in document order; NULL on a synthesized row, which is the stated absent bucket rather than a missing value, a derived row having no document position and the type’s declaration site being one join away

fields_sdl (CHARACTER VARYING, nullable)

the field-set literal: as written on an authored row, and the rule’s own id on a synthesized one

resolvable (BOOLEAN, nullable)

as written on an authored row, NULL where the author omitted it; always true on a synthesized one

intent_field_accessor_hop (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. Where an accessor hop lands: for a field coordinate and a class its parent might stand on, the class the member reading that field delivers. One edge of the walk that binds SDL types to backing classes, stated as a fact instead of as a step, so the closure over these edges is a reader’s recursion rather than a rule buried inside one. The slot a coordinate reads is the @field(name:) override where the field carries one and the field’s own name otherwise, which is the resolution the emission side makes, and @field lands on both axes so both resolve the name the same way. What they do not share is what the name resolves against. An output field is read off the class its parent stands on, so it resolves against an accessor; an input field is written into the class being built, so it resolves against a constructor argument or a setter. The two are different member sets on the same class and a class can offer one and not the other, a data holder with a getter and no setter answering an output field and no input one, so this relation has an arm per axis rather than one population keyed by the coordinate’s owner kind. The owner’s kind is what picks the arm, and only one arm tests it: writing is what the input axis does, so the write arm asks whether the owner is an input object and the read arm takes everything else. Stated that way round deliberately. A positive test on each side would make the arms depend on an owner having been typed yet, and a coordinate whose type relation has no row for it, which a minted one is until the stage that mints it has run, would answer neither; as a complement the read arm keeps it, which is what it had before there were two arms. It also leaves an interface’s fields where they belong: an interface is not an input object, its fields are read, and a rule naming the object kind positively would have dropped them. The population is the expanded one rather than the transcription, so a coordinate on a type the expansion minted hops on the same terms as one an author declared: reading the transcription here would leave a minted Edge’s node field with no rows, which is the one edge that says what a connection’s element stands on. Total over standing classes by construction. Nothing here says which class a parent actually stands on, so a coordinate pairs with every class in the graph’s sources offering a slot of that name, and a row is a conditional rather than an answer. That totality is what makes this an edge relation instead of another copy of the binding, and it is why this is a view that is never materialized: the product is large wherever a slot name is common and small wherever a reader binds the standing class before asking. Ambiguity is rows and no count. Two spellings of one property are two slots on the stated terms of whichever relation the arm reads, and both already decline to choose between them, so a count here would be a second stance on a question those relations have settled. Two departures from the walk this replaces, both to be adjudicated against its shadow rather than assumed harmless. The first is that an SDL field’s arguments are not read at all. The walk probes for an accessor whose parameters match them, and a slot is a no-argument member by definition, so this relation hops where the walk would not (an argument-taking field standing on a no-argument accessor of the same name) and stays silent where the walk would hop (a field whose accessor takes those arguments). Reading the shape here would mean a slot relation holding parameterised members, which is a different question from the one that relation answers, so the difference is recorded rather than quietly closed. Every join is on a whole primary key. Both arms are two steps: a slot names the type it yields or takes, and that type names what it delivers. Which arm produced a row is deliberately not a column: nothing downstream reads it, the closure over these edges wanting only where a hop lands, and a column saying which member set answered would be a fact about this relation rather than about the binding. The second is that the walk skips a field carrying @service and skips a child type already bound; both are conditions on the closure rather than properties of an edge, and neither belongs here.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from graphitron_field

type_name (CHARACTER VARYING, nullable)

the coordinate’s owning type: the type whose standing class the hop departs from

field_name (CHARACTER VARYING, nullable)

the coordinate’s field name within that type

source_name (CHARACTER VARYING, nullable)

the departing class’s classpath entry, as on code_read_slot; the partition the graph reached it through

from_class_name (CHARACTER VARYING, nullable)

the class the parent must stand on, or be built as, for this row to hold. A hypothesis the row is conditional on rather than a fact about the coordinate, which is exactly what keeps this relation clear of the closure that decides it

slot_name (CHARACTER VARYING, nullable)

the member name the coordinate resolved to: the @field(name:) override, or the field’s own name where it carries none

accessor_method_name (CHARACTER VARYING, nullable)

the Java declaration the hop goes through: the accessor on the read arm and the setter or constructor on the write arm, each the method its own slot relation is keyed by. The column a jump to the member’s own source lands on

to_class_name (CHARACTER VARYING, nullable)

the class the hop lands on: what the accessor’s result delivers on the read arm and what the member is filled with on the write arm, each with its containers peeled and carried from code_type_element. Not a foreign key, a landing class no classpath entry declares being ordinary rather than exceptional. A slot whose accessor returns a void, a primitive, an array or a type variable names no class and so draws no row here, the peel relation stating presence rather than carrying a placeholder, and that silence is the same one a reader would have had to read out of a null

intent_field_chain_node (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. Where a field’s @routine chain stands after each step, and how it got there. The chain is the field’s @routine and @reference applications walked as one running source; this relation is every place along it, and the one recursion in the family. A node at seq 0 is the routine’s own result, which intent_field_chain_start resolved; a node at seq k is where the k-th @reference path element written after that application lands, each departing from the previous node’s arrival through graphitron_field_reference_step_hop, exactly as graphitron_field_reference_step_target walks a path from a type’s binding. No foreign key can carry the first element out of the function result, a function result declaring none, so the two arms that reach one are the hop relation’s name-matched arm and its condition arm, which route by column name and by the condition method’s signature respectively. Which elements are the chain’s is a comparison of source positions and not of ordinals, because @routine and @reference number their ordinals separately; the start carries the position that comparison is made against, so the rule that picks the last routine application is stated once, there. An element written before the routine is not in the tail at all, moving where the chain starts and never where it ends. Absence means "not reached", as on the target view: an element resolving to nothing ends the walk, so a chain whose second element is fine but whose first names an unknown key contributes only its seq 0 node, never a node standing where the walk did not arrive. last_seq is what makes that legible without a second relation, being the tail’s own extent rather than the walk’s: a walk that stalled has no row at last_seq and therefore no terminus, and a reader wanting to say where it stalled compares the two. The route into each node travels with it, which is the difference between this relation and the landing relation over it. A reader that has to render the chain’s joins needs the constraint and its orientation at every step, and before this relation those columns were computed inside a walk and then dropped, so a reader needing them had no choice but to write the walk again. Two vocabularies, kept apart on purpose: via says which directive put the chain here, in intent_field_chain_terminus’s own words, and step_via says which arm of the element’s resolution moved it, in graphitron_field_reference_step_hop’s. One relation carrying both under one name would make every reader say which it meant.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from the chain’s start

type_name (CHARACTER VARYING, nullable)

the type owning the field the chain is written on

field_name (CHARACTER VARYING, nullable)

the field the chain is written on

seq (INTEGER, nullable)

the node’s 0-based position along the chain: 0 is the routine’s own result, k is where the k-th path element after it lands. Dense from 0 up to wherever the walk reached, which is not necessarily last_seq

last_seq (INTEGER, nullable)

the greatest seq the chain’s written elements would reach, carried on every node so the last one is identified without naming the tail again. The tail’s extent and not the walk’s, which is the whole of its use: seq = last_seq is the terminus, and seq < last_seq on every node of a chain whose walk stopped early says both that it stopped and where

ordinal (INTEGER, nullable)

the application’s ordinal within its own directive name: the @routine’s at seq 0, the owning @reference’s after that. A seq 0 node joins back to graphitron_routine_entry on it and a later one to graphitron_field_reference_entry

position (INTEGER, nullable)

the path element’s 0-based position within its own @reference application; NULL at seq 0, a routine application having no elements. Distinct from seq, which runs across applications

via (CHARACTER VARYING, nullable)

which directive put the chain at this node: ROUTINE at seq 0, REFERENCE after it. The vocabulary intent_field_chain_terminus publishes, projected from here unchanged

step_via (CHARACTER VARYING, nullable)

which arm of the element’s resolution moved the chain into this node: KEY, TABLE, NAME_MATCH or CONDITION, carried from graphitron_field_reference_step_hop where each is argued. NULL at seq 0, where no element moved it

key_matched_by (CHARACTER VARYING, nullable)

for a KEY step, which namespace answered: SQL_NAME or JOOQ_NAME. NULL on a TABLE, NAME_MATCH or CONDITION step and at seq 0, as on the hop relation

from_source_name (CHARACTER VARYING, nullable)

the departing table’s catalog partition: the previous node’s arrival. NULL at seq 0, which the chain departs nothing to reach

from_schema (CHARACTER VARYING, nullable)

the departing table’s SQL schema; NULL at seq 0

from_table (CHARACTER VARYING, nullable)

the departing table’s SQL name; NULL at seq 0

to_source_name (CHARACTER VARYING, nullable)

the arriving table’s catalog partition, first column of its sql_table key; the function result itself at seq 0

to_schema (CHARACTER VARYING, nullable)

the arriving table’s SQL schema

to_table (CHARACTER VARYING, nullable)

the arriving table’s SQL name. With the two columns above this is sql_table’s full key, so the node’s columns, its primary key and its generated classes are each one join away

table_type (CHARACTER VARYING, nullable)

the arriving table’s kind, carried from sql_table: FUNCTION at seq 0 by construction, and whatever the hopped-to table declares after that. The column the read-surface axes over a chain turn on, because a function result has no primary key and no foreign keys, so an ordering there cannot fall back on a key and must be authored

constraint_name (CHARACTER VARYING, nullable)

the foreign key the step joins on, named or discovered; NULL on a NAME_MATCH or CONDITION step and at seq 0. As on the hop relation, its own sql_referential_constraint key is this name under whichever endpoint declares it, which fk_on_from says

fk_on_from (BOOLEAN, nullable)

TRUE when the departing table declares the foreign key, FALSE when the arriving one does; the step’s direction. NULL on a NAME_MATCH or CONDITION step and at seq 0, as on the hop relation

targets (INTEGER, nullable)

how many distinct tables the chain reaches at this seq, this row’s arrival being one of them; 1 where the destination is certain. Separate from candidates for graphitron_field_reference_step_target.targets' reason: a step with three foreign keys connecting the two tables reaches one table by three routes, so a reader that only needs the destination can trust it while a reader that has to render the join cannot

candidates (INTEGER, nullable)

how many rows the chain resolved to at this seq, counting routes and not just destinations; 1 is the walk’s requirement for an expressible step, and a larger number is what the "which foreign key did you mean" rejection counts. At seq 0 it counts landings of the routine’s own name, two schemas declaring it being genuinely two

intent_field_chain_start (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. Where a field’s @routine chain begins: the last @routine application written on the field, resolved to the table-valued function result it names. The last and not the first, because a second @routine application restarts the chain rather than extending it, so the chain a reader cares about departs from the last one; applications before it move where the chain starts and never where it ends. Two conditions, and both are the resolution rather than the rule: the spelling resolves through graphitron_spelled_table as any written table name does, and the result is then required to be FUNCTION-typed, which is the only kind @routine accepts. A routine name resolving to no FUNCTION-typed table yields no row, and the chain over it therefore has no start, no nodes and no terminus, which is the silence intent_field_chain_node states the general form of. Its own relation because two things need it and each needs a different part: intent_field_chain_node seeds its walk from the landing, and a rejection about an unresolvable @routine names this coordinate, which is what the source position on the row is for. That view’s tail used to need the position too, to find the elements written after this application, because @routine and @reference number their ordinals separately and no relation related them; it reads graphitron_field_chain_application now, which states the written order across directive names as rows. No arity column: two schemas declaring the routine’s name is genuinely two rows here, and the count a reader wants is over the chain’s landings rather than its departures, which is intent_field_chain_terminus.candidates. Adding one would put a second window function under a relation the node walk inlines, and buy a number nothing asks this relation for.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from graphitron_routine_entry

type_name (CHARACTER VARYING, nullable)

the type owning the field the chain is written on

field_name (CHARACTER VARYING, nullable)

the field the chain is written on

ordinal (INTEGER, nullable)

the @routine application’s own ordinal, which is the greatest on the field; joins back to graphitron_routine_entry on it, and is the coordinate a rejection about the routine names

source_name (CHARACTER VARYING, nullable)

the schema document the application is written in, carried from graphitron_routine_entry; the tail is measured within this document and not across documents

source_line (INTEGER, nullable)

the application’s line in that document

source_column (INTEGER, nullable)

the application’s column on that line. With the line and the document name, what an @reference application is compared against to decide whether it extends this chain or precedes it

table_source_name (CHARACTER VARYING, nullable)

the function result’s catalog partition, the first column of the sql_table key this row names

table_schema (CHARACTER VARYING, nullable)

the function result’s SQL schema

table_name (CHARACTER VARYING, nullable)

the function result’s SQL name. With the two columns above this is sql_table’s full key, so the result’s columns and its generated classes are each one join away. Its table_type is FUNCTION by construction and is therefore not carried; the node relation states the kind of every landing including this one, so a reader asks one column whichever node it holds

intent_field_chain_terminus (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. Where a field’s @routine chain lands, and what kind of table it lands on. The chain is the field’s @routine and @reference applications walked as one running source, and its terminus is the last node; every read-surface axis on a routine-backed field is a question about that node. Which table an ordering or a filter resolves its column names against is the terminus, and whether the terminus is a table-valued function’s result decides whether an ordering can fall back on a primary key at all, a function result having none. Both were answered per axis before this relation, each from the directives directly, which is how one property of one catalog object came to be restated as several unrelated refusals. Population: fields carrying at least one @routine. A field whose navigation is @reference alone has a terminus too and it is not this relation’s, graphitron_field_column_scope’s PATH_TERMINAL rule answering it from the type’s own binding; the chain arm that view is missing should read the chain relations rather than grow a second copy of the walk. A selection and not a walk: intent_field_chain_node carries every place the chain stands, and the terminus is its rows at seq = last_seq. That extent is the written tail’s and not the walk’s, so a chain whose walk stopped short has no row here at all, which is the same silence this relation always kept and the reason absence means "not reached", never "resolves to nothing in particular"; where such a walk stopped is now answerable on the node relation, by comparing the two. Ambiguity is rows, and they are landings rather than routes: an element reaching one table by three foreign keys is one row here where the node relation has three, a terminus being a place and not a join, and a reader that has to render the join reads the node relation where the routes are. Two schemas declaring the routine’s name is genuinely two landings, and candidates says so.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from graphitron_routine_entry

type_name (CHARACTER VARYING, nullable)

the type owning the field the chain is written on

field_name (CHARACTER VARYING, nullable)

the field the chain is written on

via (CHARACTER VARYING, nullable)

which node ends the chain: ROUTINE where the @routine application is the last one written, REFERENCE where a path element after it is. A property of the chain rather than of the landing, and what tells a reader whether the terminus is the function result itself or a table hopped to out of it; what kind of table it is is table_type beside it

ordinal (INTEGER, nullable)

the terminating application’s ordinal within its own directive name, so a ROUTINE row joins back to graphitron_routine_entry on it and a REFERENCE row to graphitron_field_reference_entry. The coordinate a rejection about the terminus names

position (INTEGER, nullable)

the terminating path element’s 0-based position within its application; NULL on a ROUTINE terminus, a routine application having no elements

table_source_name (CHARACTER VARYING, nullable)

the landing table’s catalog partition, the first column of the sql_table key this row names

table_schema (CHARACTER VARYING, nullable)

the landing table’s SQL schema

table_name (CHARACTER VARYING, nullable)

the landing table’s SQL name. With the two columns above this is sql_table’s full key, so the terminus’s columns, its primary key and its generated classes are each one join away

table_type (CHARACTER VARYING, nullable)

the landing’s kind, carried from sql_table: FUNCTION where the chain ends on the routine’s own result, whatever the hopped-to table declares otherwise. The column every axis over this relation actually turns on, because a function result has no primary key and no foreign keys, so an ordering there cannot fall back on a key and must be authored. Always FUNCTION on a ROUTINE row, which is worth carrying rather than leaving to the via column: a reader asks one column whichever arm answered, and the day a non-function callable reaches a chain the answer changes here instead of at every reader

candidates (INTEGER, nullable)

how many distinct tables this field’s chain lands on, this row’s landing being one of them; 1 where the terminus is certain. Distinct landings and not routes, which is the arity a reader of a terminus needs and the reason this relation counts differently from the hop and target views; stated as a column rather than left to each reader’s own count, on intent_bound_table.candidates' terms

intent_field_column_table (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. Which table a column name written at a field’s site resolves against, when that table is not the one the field’s own parent is bound to. The question an editor asks at a @field(name:) or @defaultOrder(fields: [{name:}]) site, and the resolution three LSP arms (completion, hover, the field-member diagnostic) each used to ask a projected per-permit switch. The navigation itself is graphitron_field_column_scope’s and no longer restated here: this view is that relation read as an override, its two non-parent bases carried through as RESOLVE rows and its parent-binding rows dropped. Deliberately narrow, which is what dropping them means: a field whose column names resolve against its parent’s own binding contributes no row, because a reader already holding the parent’s binding needs no relation to tell it so, and stating that case here would make this view a copy of the scope keyed one grain down. Absence therefore means "the parent’s own scope answers", which is the reading every consumer already falls back to; only a row overrides it. Two rules produce silence, meaning "no column name resolves here, and the parent’s scope must not stand in", and both are this view’s own rather than the scope’s: a coordinate whose classification the author has already contested, and an authored path that reaches no single table, the second read as the scope answering a path-carrying field with no terminal. The conflict silence stays here on purpose, because the column-match classifier reads the same scope and its raw reading at a contested coordinate is what lets a diagnostic name the override. The silences are structural, never a reading of the rejection residue: a derivation that asked the residue whether a coordinate had been reported would go quiet the day that family drains, and this relation’s meaning must not depend on where a message currently lives.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from every arm’s base relation

type_name (CHARACTER VARYING, nullable)

the site’s owning type; the parent whose binding this row overrides

field_name (CHARACTER VARYING, nullable)

the site’s field name within the owning type

disposition (CHARACTER VARYING, nullable)

RESOLVE when the row names a table to resolve column names against, SILENT when it names none and the parent’s scope must not stand in. A closed two-value fork, which is what a consumer switches on; the basis it came from is the next column. Determined by basis rather than independent of it, and carried anyway because the fork is the reading every consumer needs and re-deriving it from a five-value vocabulary at each of them is how the two would drift

basis (CHARACTER VARYING, nullable)

which rule produced this row: PATH_TERMINAL (an authored @reference path’s terminal element), NAMED_TYPE_TABLE (the field’s named type’s own binding), UNRESOLVED_PATH (an authored path reaching no single table), CONFLICTED (the coordinate’s claims are mutually exclusive). A closed vocabulary, and the column that lets a consumer explain its answer and a test pin which rule fired without asserting on the table it happened to reach

table_source_name (CHARACTER VARYING, nullable)

the resolved table’s catalog partition, the first column of the sql_table key this row names; NULL on every SILENT row

table_schema (CHARACTER VARYING, nullable)

the resolved table’s SQL schema; NULL on every SILENT row

table_name (CHARACTER VARYING, nullable)

the resolved table’s SQL name; NULL on every SILENT row. With the two columns above this is sql_table’s full key, so the columns themselves are one join away

intent_field_demand_rule (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. The types whose fields require a classification verdict, one rule literal per arm. Type-keyed by design: every rule shipped so far is a property of the parent type, so this is the rule’s authored grain and the field grain is a join in the resolved view, legible as a projection rather than materialized into the rule literal. The root arm is keyed by the root operation binding, not the conventional names, so it states the intended rule; today’s walk dispatches on the literal names Query and Mutation, and a renamed root’s fields are a known demanded-but-unregistered population the shadow agreement pins. The producer arm covers the payload types whose producers capture can see (@service and @externalField references that decoded to a class, and every DML @mutation payload); a DELETE payload’s data field is thereby demanded even though today’s walk loses its verdict on every path but the ID-element repayment, which is the other pinned population. The underscore masks transcribe the walk’s short-circuit: an underscore-prefixed type never classifies, whatever it carries, while a root binding is checked before that short-circuit and stays unmasked. Each rule’s witnesses live one join away in the arm’s base relation; this view carries the rule key only, so no arm’s witness columns go nullable on the others.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried through from every arm’s base relation

type_name (CHARACTER VARYING, nullable)

the parent type whose fields the rule demands verdicts for

rule (CHARACTER VARYING, nullable)

why the fields are demanded; a closed vocabulary (ROOT_OPERATION, TABLE_TYPE, ERROR_TYPE, PRODUCER_PAYLOAD) the reading side decodes into a typed value

intent_field_error_channel (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. Which coordinate has an error channel and what the channel is made of: one row per producing field whose returned type declares an error channel, total over them. The grain is the producing coordinate and not the payload, because a channel is something a field routes its throws into and two fields returning one payload are two channels, which is exactly the population the constant-name dedup groups over. Which field of the payload is the channel is intent_errors_field’s answer and the pick is this relation’s: a payload declaring several errors-shaped fields routes through the first in declaration order, so the join takes the minimum ordinal and carries it, the walk’s first-wins rule stated as a column rather than left implicit in a scan order. What the relation carries is the channel’s inputs and never its minted name. mappingsConstantName is a generated identifier, and a column holding one would make this relation a second site where a naming formula is spelled; the formula’s one home is GeneratedUnits, which reads these columns. That is the whole reason the payload class is here in binary form and the payload type in SDL form: the fold that mints the constant takes one of them depending on the transport, and a store that carried the folded result instead would have decided which. The transport is a decode over three facts and a precedence, not a transcription of the classifier’s control flow. A root @service field rides the typed Outcome wrapper, whichever shape its payload has, so that arm is tested first and wins over the carrier arm where both would answer; a payload the carrier recognition admits under the producing family is a directiveless structural wrapper whose catch arm ferries through graphql-java’s localContext; anything else constructs a developer payload class at the catch site. The precedence is real and stated rather than partitioned away, a root @service payload being a carrier under its own family as well. Ambiguity in the backing class is an arity and not a pick, on intent_bound_table’s terms: a payload two populations back differently reports the count and no class, so a reader needing one class sees the contest here instead of receiving a silent winner, and intent_type_backing is where the contesting classes are rows. A coordinate whose payload declares no errors-shaped field is absent rather than present with a null transport, this relation being total over channels and not over producers; a producer with no channel is a fact intent_field_payload_producer already carries.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

type_name (CHARACTER VARYING, nullable)

the type declaring the producing field; a root operation type where the producer is a root write, the parent type where it is a child @service field

field_name (CHARACTER VARYING, nullable)

the producing field’s name; with the type, the coordinate whose throws this channel routes

transport (CHARACTER VARYING, nullable)

how the catch arm hands errors back, a closed three-value domain: OUTCOME_WRAPPER for a root @service field, whose errors ride the typed Outcome the fetcher returns; LOCAL_CONTEXT for a structural carrier, whose catch arm returns a null-column sentinel and ferries the throwables through graphql-java’s localContext; PAYLOAD_CLASS for a channel whose catch arm constructs a developer payload class and slots the list into it. Decoded, in that order, from whether the coordinate is a root @service field, which is intent_field_payload_producer.root_operation being present, and whether the carrier recognition admits the payload under this family; the order is a precedence and not a partition, both arms answering for a root @service payload

family (CHARACTER VARYING, nullable)

which producing directive returns the payload, a closed three-value domain: SERVICE (@service), DML (@mutation), ROUTINE (@routine); carried from intent_field_payload_producer on graphitron_carrier_data_field.family’s terms

payload_type_name (CHARACTER VARYING, nullable)

the SDL type the producing field returns, unwrapped; the type declaring the errors field, and the fold’s input on the two transports that mint from an SDL name

errors_field_name (CHARACTER VARYING, nullable)

which field of the payload is the error channel; the first errors-shaped field in declaration order where the payload declares several, all of which are rows on intent_errors_field

errors_field_ordinal (INTEGER, nullable)

that field’s declaration index within the payload, carried from intent_errors_field; the ordinal that decided the pick, and on the payload-class transport also the canonical constructor’s errors-slot parameter index

payload_class_name (CHARACTER VARYING, nullable)

the fully-qualified binary name of the class the channel routes through, from intent_type_backing, and the fold’s input on the payload-class transport. NULL where the payload has no backing class and equally where it has more than one, an ambiguous backing being no backing at all; the count says which, and the candidates are rows on intent_type_backing

payload_classes (INTEGER, nullable)

how many distinct classes back the payload type; 1 is what a payload-class transport requires, 0 is a payload no population backs, and more is a contest intent_type_backing_conflict names. An arity rather than a pick, so a reader’s refusal stands on a number it did not have to count

intent_field_exemption_rule (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. The types whose fields are intentionally not demanded, a reason per arm, type-keyed like the demand rules. Arms are unmasked against each other and against demand, so overlapping readings survive as rows (a structural connection type is also a directiveless object, and both rows are true); one-reason-per-coordinate is the resolved view’s job, per the same masked-reading argument the column-match classifier records. The interface arm is the census’s largest population (no interface’s fields ever classify); the input arm makes the trace-only input coordinates explicit rows; the underscore arm transcribes the walk’s name short-circuit at the field-bearing object kind (interfaces and inputs are already covered by their kind arms); the machinery arm is the structural connection recognition (an object with an edges field whose object element has a node field, reached by some carrier field, plus that shape’s edge type, plus the SDL-declared PageInfo when any promotion would fire), whose fields the connection emitter owns; the nesting-target arm is the walk’s own absence-shaped rule (a plain object with no classifying directive, no root binding and no store-visible producer resolves through its embedding edge, or is an orphan whose rejection surfaces at the referencing field), stated by its own predicate rather than as an anti-join of the demand view, so the two relations state their rules independently and the resolved view owns their meet. Types bound only through the reflection fixed point (accessor chains, record-composite carriers) are deliberately in neither this view nor the demand view; that population is the shadow residue whose store-side closure lands with the binding-walk classifier migration.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried through from every arm’s base relation

type_name (CHARACTER VARYING, nullable)

the parent type whose fields the rule exempts

reason (CHARACTER VARYING, nullable)

why the fields are exempt; a closed vocabulary (INTERFACE_TYPE, INPUT_TYPE, UNDERSCORE_TYPE, CONNECTION_MACHINERY, NESTING_TARGET). Named reason, not classifier: classifier is reserved family-wide for classification kinds

intent_field_navigated_type (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. Which type a field’s own generated SQL navigates as: the type whose binding, whose members and whose columns a rule at this coordinate should read, as against the type the field’s signature happens to name. The two differ wherever a wrapper stands between the field and what it delivers, and a rule that reads the signature at such a coordinate reads the wrapper’s facts, which are none. Total over graphql_field: every field navigates as something, so a consumer joins this rather than left-joining it, and the fallback rung is what makes that true. Two rungs, and the relation is a projection of graphitron_field_navigation, which is where they are computed and where the rules are stated. The connection’s element where the field’s named type is a connection, and the named type itself otherwise. A third rung is retired and worth naming because its absence is a result rather than a simplification: it read the expression the author wrote wherever a macro had rewritten the field, and measured over a consumer-size schema every row it answered is the row the two rungs below it answer, a synthesised connection’s edges.node being the element the authored expression named. It was also the only rung needing something no relation held, and therefore the only reason this rule had to be computed where the parse was. This relation is the correction of a resolution that had five spellings. The COALESCE over the synthesis record was written out at five sites, and all five read the same way: a connection navigates as its element when the generator built the connection, and as the wrapper when the author wrote it. The second half of that sentence is a silence and not a rule. A field returning an author-declared connection type resolved to a type binding no table, so it had no scope table, so its arguments had no scope, so a filter argument on it resolved no column and the condition membership fold could not see it, all from a rule that claims to navigate connections and only navigated the ones with a synthesis row. All five sites read this relation now and are correct at both halves: graphitron_field_scope_table, intent_field_participant_scope_table, intent_routine_return_binding, intent_mutation_routine_seat and graphitron_field_column_scope’s named-type arm. The rule to hold this relation to is not a count, which has been wrong twice by construction and is what an unguarded inventory does: every site that needs a field’s navigated type reads this relation, and the next spelling it exists to prevent is the one nobody has written yet. One thing a new reader owes itself, learned at the last site to arrive: join what this relation projects, and join it directly. A reader that takes the navigated type from here and then joins a binding onto some other relation’s echo of that name hands the planner a cheaper driver than this one, and a view is seekable on the coordinate it is keyed by rather than on a name it projects, so the relation lands on the probed side and is evaluated once per driving row. That is a property of every projection in this store and not of this arm, which is why it is stated here rather than only there. The basis column says which rung answered, so a test can pin the rule rather than only the answer. What this relation does not do is resolve anything: it names a type, and whether that type binds a table, holds polymorphic members or declares columns is each consumer’s own join. Nor does it look through a polymorphic container; a field returning a union navigates as the union, and the members are intent_poly_member’s answer read from that name. Declared before intent_routine_return_binding because that is the first of its readers, and the ordering here is a dependency rather than a reading order.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from graphql_field; the leading key dimension that keeps one workspace’s graphs apart

type_name (CHARACTER VARYING, nullable)

the type owning the field

field_name (CHARACTER VARYING, nullable)

the field whose navigation this row states; with the two columns above, the grain, and one row per field of the graph

basis (CHARACTER VARYING, nullable)

which rung answered, in a closed vocabulary of two: CONNECTION_ELEMENT from the structural edges.node shape of a connection type, NAMED_TYPE from the field’s own named type. A third rung read the pre-expansion type expression a macro had rewritten, and went when the expansion stopped overwriting it: the field’s own row carries what the author wrote, so the expression is a column rather than a rung. Provenance and a pinnable rule both; a reader that means one of them filters on it and owns having chosen

navigated_type_name (CHARACTER VARYING, nullable)

the type name the field navigates as, wrappers already stripped. A name and never a binding, so a consumer joins graphitron_resolved_type_binding, intent_poly_member or graphql_type on it according to what it actually needs to know

intent_field_participant_scope_table (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. Which table one participant of a field’s polymorphic named type binds: the table that participant’s own branch of the field’s generated SQL is rooted in. A field returning a union, or an interface carrying no @table of its own, resolves to several tables rather than to one, and the classifier answers it by lowering the field once per table-bound participant, each against that participant’s own table; this relation is that population, one row per participant the field’s named type holds a binding for. The participant’s type name is a key column and not provenance, because it is what a consumer needs beyond the table: the generated condition method is named after the participant rather than after the container, so two participants of one field are two named units and a row carrying only a table could not tell a consumer which. Disjoint from both of graphitron_field_scope_table’s ranked rungs by construction rather than by precedence, which is why that relation unions this one in outside its window instead of ranking it as a third rung. The container binding nothing of its own is this relation’s own precondition, and it is exactly what separates the shape from the single-table discriminated interface, whose interface does carry @table and whose participants therefore share one table and one filter surface; a field carrying a @mutation(table:) spelling that resolves is excluded for the symmetric reason, the author having said which table the coordinate’s SQL binds against. Each participant’s binding must be unambiguous, on intent_field_reference_discovery’s terms and for the reason the ranked rungs give: a branch is a statement and two candidate tables are two different statements. A member with no binding at all contributes no row and no rejection here, the container whose every member must bind being the type classifier’s invariant and not this relation’s; a partially bound container is therefore incomplete here and rejected there, which is the division of labour every rule relation in this family keeps. Two participants binding one table are two rows, the grain being the participant; a consumer that wants tables takes them through graphitron_field_scope_table, whose projection of this relation is distinct on the table for that reason. Nothing here says any argument or name at the coordinate is column-shaped: this relation answers where each branch is rooted, and what each branch filters on is the argument-site resolution’s answer, reached one table at a time through that projection. Read cost, measured on the sakila example schema at 917 fields and 267 arguments, 128 rows out, five interleaved sweeps with result reuse off, so every figure carries an execution count above one and a standard deviation. The shape that ships joins the membership directly onto the stripped type expression and costs 47 milliseconds. Projecting that expression into an inner derived table first and joining the membership on the column costs 27, a 42% saving that is measured, reproduced, and deliberately not taken; the paragraph after this one is why, and it is the more useful half of the measurement. Two controls decided the rest. Driving from the 52 membership rows rather than the 917 fields, which reads like the obvious win, measured 29 milliseconds with three times the spread, so the smaller driver bought nothing. And the shipped shape with both exclusions removed measured 42 against 47, so the two anti-joins are about a tenth of the cost and the expansion is the rest; both children price under a millisecond, the membership at 0.3 and the binding at 0.04, which is what says there is no expensive child to register underneath this. The projection was called unshippable here for two builds and it ships now, which is worth the sentence it takes to say what changed, because the reason it was unshippable was real. The projection changes which plan H2 takes for this relation and for the two above it, and under that plan the registered read of graphitron_resolved_type_binding visited more rows than reading its source view would, for this relation, graphitron_field_scope_table and graphitron_argument_scope_table_rule alike; the read-cost gate of the time asserted the opposite over every such pair, so the projection failed the verification build deterministically. What closed it was not a rewrite but an index. The registration on graphitron_resolved_type_binding shipped without one, which cost nothing while every reader spelled its type expression inline, H2 pushing that expression down into the probe, and stopped costing nothing the moment the expression became a column: a join onto a projected column is one the planner may satisfy by scanning. ix_resolved_type_binding_type is the probe those readers actually make, and with it this relation and the field-grain scope table above it are both monotonic again. The same measurement carries its own warning, and it is the fact model’s: three readers further down the write family are still counted non-monotonic through that binding while their wall clocks did not move at all, so the counter and the clock disagree there and the read-cost gate’s pinned set recorded which was which. This relation’s own clock is what it costs: the projection took it from 47 milliseconds to 63, driving from intent_field_navigated_type rather than from graphql_field, which is the shape that measured best of the three tried; joining that relation while still driving from the field list measured 228. Read the sibling essay on graphitron_field_scope_table beside this, because the two look contradictory and are not: it was retired at the field grain once the far side of that join became a table, and there is nothing to re-evaluate per driving row when the far side is stored. intent_poly_member is a view, so the projection pays here, and the condition is what generalises rather than either verdict. Not stored, and the reason is reader count rather than cost: one relation names this one, and one names that, so a stage writing it would pay one write per capture to save one evaluation. The arm does raise graphitron_field_scope_table from 16 milliseconds to 59, which is the honest price of a question the store could not answer at all before, paid once per capture of the argument scope it feeds. When the condition membership fold arrives as a second reader that trade changes and is worth re-measuring then. The population is stated structurally and not narrowed to where an emitter exists, on intent_node_id_encode’s terms: a child field whose named type is a multi-table container has the same fact as a root field with that type, whether or not the generator carries a per-participant filter surface there, and narrowing the rows to today’s emitter would make this relation track emitter maturity instead of the schema.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from graphql_field

type_name (CHARACTER VARYING, nullable)

the type owning the field whose branches this row states; not the polymorphic container, which is the field’s named type

field_name (CHARACTER VARYING, nullable)

the field whose named type is the polymorphic container

member_type_name (CHARACTER VARYING, nullable)

the participant this row answers for: the union member or interface implementor whose table the branch is rooted in. Part of the grain, and what a consumer minting a per-participant unit name reads; the participant’s position within its container is intent_poly_member’s and is not restated here

table_source_name (CHARACTER VARYING, nullable)

the participant table’s catalog partition, the first column of the sql_table key this row names

table_schema (CHARACTER VARYING, nullable)

the participant table’s SQL schema

table_name (CHARACTER VARYING, nullable)

the participant table’s SQL name; with the two columns above this is sql_table’s full key, so the branch’s own columns are one join away

intent_field_payload_producer (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. Which coordinate produces a value and what type it returns: one row per field carrying a producing directive, with the directive’s family and the unwrapped SDL type the field’s value arrives as. The grain is the coordinate, which is what separates this from graphitron_carrier_data_field’s producer reading: that view asks which payload types a mutation root returns and folds the coordinates away, so a payload two fields return is one row there and two here. Both readings are wanted and only this one can key a fact to the field an author is looking at, so the fold is the reader’s and this relation does not perform it. A @routine field is DISTINCT because a chain applies the directive once per hop and the coordinate produces one value however many hops reached it, the hops being intent_field_chain_node’s rows. Where the coordinate sits is a column rather than a filter, for the same reason the family is: a root write and a child @service field are the same fact under different readings, and the two policies that turn on the position (the carrier scan wants root mutations, the error channel’s transport wants root @service) each name what they mean. One column carries it and not two, the operation being the discriminator and its absence the predicate, so a reader asking only whether the field sits at a root writes that as a null test rather than reading a boolean that would have to agree with it. A type serving as two root operations at once reports the alphabetically first, which keeps the grain at the coordinate; nothing in the schema forbids the shape and nothing in the generator has met it. @externalField is deliberately absent: it names a class member that answers an already-produced value rather than a directive that produces one, and intent_field_producer_reference is where the two meet as method references. Absence here means the field carries none of the three directives, not that it has no value.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

type_name (CHARACTER VARYING, nullable)

the type declaring the producing field

field_name (CHARACTER VARYING, nullable)

the producing field’s name; with the type, the coordinate this row is about

family (CHARACTER VARYING, nullable)

which producing directive the field carries, a closed three-value domain: SERVICE (@service), DML (@mutation), ROUTINE (@routine). A field carrying two is a row per family rather than a pick, on graphitron_carrier_data_field.family’s terms

payload_type_name (CHARACTER VARYING, nullable)

the unwrapped SDL type the field returns, carried from graphql_field.named_type; the payload whose shape every carrier and channel reading starts from

root_operation (CHARACTER VARYING, nullable)

which root operation the declaring type serves, QUERY / MUTATION / SUBSCRIPTION, or NULL where it serves none, which is what a reader asking only whether the field sits at a root tests. The position two policies turn on, and stated here so neither has to join graphql_root_operation to ask. The alphabetically first where a type serves two, which keeps this relation at the coordinate’s grain

intent_field_producer_method (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. The method a field’s authored Java reference names: intent_field_producer_reference resolved against code_method, one row per method the reference matches. A use-keyed resolution over a source-keyed reading, which is the shape an authored coordinate reaching into the classpath always takes here, and it states the resolution alone: what the method’s return delivers is code_type_element’s answer, reached through code_method.result_type. Which directive named the method, how the two arms coalesce and where the @externalField omitted-method fallback is applied are all the reference relation’s, stated in its comment; this relation adds the name match and nothing else, so a reader wanting the authored names without the match reads the reference and is not made to care whether the class was scanned. Ambiguity is rows and never a decline, as on intent_bound_table: a reference matching two overloads is two rows and candidates says so. That is the one place this relation departs from the walk it replaces, which takes whichever matching method the reflection API hands back first, in an order the JVM does not specify, so the walk’s answer for an overloaded name is unstable rather than merely arbitrary. The intended reading is that a reference matching more than one method is a rejection, and what a rejection needs is the arity, which is why this relation states it rather than picking. Absence has two causes and one join separates them: no code_class row under the graph’s sources means the reading never reached the class (its filters, an entry nothing read, the generated jOOQ package), while a class row with no method row means the class declares no method of that name. Nothing here judges the reference beyond matching it. A row here does not assert the method satisfies the directive that named it, because a name match is all this relation performs: whether a method is admissible at @externalField is code_external_field_method’s answer and whether it is static is a column of code_method, and a reader wanting either asks there rather than inferring it from a match. A nested class an author spells Outer.Inner matches nothing, the reading writing the $ the JVM writes and skipping nested classes anyway.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from the directive relation the arm reads

type_name (CHARACTER VARYING, nullable)

the referring field’s owning type

field_name (CHARACTER VARYING, nullable)

the referring field’s name within the owning type

declared_via (CHARACTER VARYING, nullable)

SERVICE or EXTERNAL_FIELD: which directive named the method, a closed two-value vocabulary. Carried rather than derived because the pair of names a row resolves cannot tell the two apart, and they are not interchangeable: a service method is invoked for the field’s value, an external field’s is invoked once for the jOOQ Field the generator selects. A coordinate carrying both directives is a conflict intent_authored_claim_conflict already reports, and here it is simply two references, each resolved on its own, neither winning

source_name (CHARACTER VARYING, nullable)

the resolved method’s classpath entry, as on code_method; the census partition the graph reached through store_graph_source, and the reason another graph’s entries cannot answer this graph’s reference

class_name (CHARACTER VARYING, nullable)

the fully-qualified binary name of the class declaring the resolved method, matched against the reference exactly. Java names are case-sensitive, so a misspelling resolves to nothing rather than to a near match

method_name (CHARACTER VARYING, nullable)

the resolved method’s name: the reference’s method argument, or the SDL field’s own name where an @externalField omitted it

descriptor (CHARACTER VARYING, nullable)

the resolved method’s raw JVM descriptor, code_method’s overload discriminator and the whole of what tells two rows of one reference apart. The column a reader carries forward to reach the method’s parameters and the classes its declared return type names

candidates (INTEGER, nullable)

how many methods the reading read that this reference matches, this row being one of them; 1 on an unambiguous reference. Partitioned by the reference and not by the coordinate, so a field carrying both directives does not report one arm’s overloads as the other’s. Two overloads and one class declared by two classpath entries both raise it, which is one fact from a reader’s side: the reference names more than one method. Stated as a column rather than left to each reader’s own count, on intent_bound_table.candidates' terms, whether a reference is unique being what decides the reading

intent_field_producer_reference (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. The Java method a field’s authored directive names, before anything checks whether it exists: @service and @externalField coalesced, one row per application. Named apart from its resolution because the two answer different questions and one of them survives an unreachable class. A surface that must name the declaration a field binds to needs the reference, which the author wrote and which is a fact whether or not the classpath census reached the class; a surface that needs the method’s arity or wants to know the reference is ambiguous needs intent_field_producer_method, which is this relation resolved against code_method and therefore empty exactly where the census fell short. Splitting them also gives the @externalField omitted-method fallback one home: graphitron_external_field_entry’s own comment defers that default to a derivation, and this is it, so no reader repeats the coalesce. Two arms coalesced by a view rather than one relation over a merged base, because which directive named the method is not recoverable from the pair of names and the two say different things about how the method is reached; declared_via carries it, on the terms any discriminator is carried on: two rows that would otherwise be identical say different things, and which of them a reader wants is not recoverable from the rest of the row. Nothing here judges the reference: a coordinate carrying both directives is two rows, neither winning, and the conflict is intent_authored_claim_conflict’s to report.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from the directive relation the arm reads

type_name (CHARACTER VARYING, nullable)

the referring field’s owning type

field_name (CHARACTER VARYING, nullable)

the referring field’s name within the owning type

declared_via (CHARACTER VARYING, nullable)

SERVICE or EXTERNAL_FIELD: which directive named the method, a closed two-value vocabulary, carried forward to intent_field_producer_method where its full argument is written

class_name (CHARACTER VARYING, nullable)

the fully-qualified binary name the reference spells, exactly as authored. Unresolved: no row here asserts the class is on the classpath, and a misspelling is a row like any other

method_name (CHARACTER VARYING, nullable)

the method name the reference spells: the directive’s method argument, or the SDL field’s own name where an @externalField omitted it. An @service missing either name has no row at all, that directive having no fallback

intent_field_reference_discovery (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. The foreign key an omitted @reference path discovers: for a field whose parent type and named type are each bound to a table, every foreign key connecting those two tables in either direction. This is the resolution the walk runs where a field carries no path element, and sql_referential_constraint’s own comment defers it here, "exactly one foreign key between these two tables" being a derivation over that relation rather than a captured fact. Separate from graphitron_field_reference_step_hop because that view resolves what an author wrote and this one answers where nothing was written; the hop view names this as a resolution it deliberately does not perform, so its silence is not the absence of a discovery. Neither endpoint is re-derived here. The arriving table is graphitron_field_column_scope’s named-type rule, which reads the navigation so a synthesised connection field navigates as its element type, demands an OBJECT named type and an unambiguous binding, and excludes the coordinates an authored claim, a @pivot or an authored path diverts; restating any of that would be a second spelling of the navigation that view exists to state once. That rule’s own comment carries what it does not answer for, an author-declared connection, and why it alone among its siblings still spells the navigation rather than reading intent_field_navigated_type. The departing table is the parent’s own binding, demanded unambiguous for the reason the arriving one is: a discovery between endpoints that are not certain is not the pair the walk would have had in hand. One row per connecting key and not two, a foreign key connecting a pair once whichever end declares it, and fk_on_from says which end that is; a self-referential key therefore needs no special case, the same-table pair being excluded outright. Excluded because the walk excludes it, comparing the two table names case-insensitively and nothing else, so two like-named tables in different schemas are one table to this rule as they are to the walk. Both names are catalog values reached through derived views, and a derived view does not forward a fold, so the comparison joins sql_table on its key at each end and reads the fold there; that costs two lookups on a primary key and keeps the fold a property of the relation that owns the spelling. The self-referencing field states its key explicitly or is rejected with that advice. Absence covers several things and none of them is "the discovery found nothing in particular": no foreign key connects the endpoints, or an endpoint is unbound or ambiguously bound, or the coordinate is one the named-type rule excludes. The walk’s other element-less arm needs no exclusion here: where the departing table is a table-valued function the walk name-matches instead of discovering, and a routine result declares no foreign keys, so such a coordinate contributes no rows on its own. The departing endpoint reads graphitron_resolved_type_binding, as the arriving one already does through the navigation view, so a parent bound by a @routine chain’s return rather than by a written @table is the same endpoint here; where that chain landed on a function result the sentence above is why the pair still finds nothing, and where it landed on a stored table through a hop the discovery is the ordinary one.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from the navigation view

type_name (CHARACTER VARYING, nullable)

the type owning the field the path was omitted on; also the type whose binding is the departing end

field_name (CHARACTER VARYING, nullable)

the field name within the owning type

from_source_name (CHARACTER VARYING, nullable)

the departing table’s catalog partition, first column of its sql_table key

from_schema (CHARACTER VARYING, nullable)

the departing table’s SQL schema

from_table (CHARACTER VARYING, nullable)

the departing table’s SQL name; the parent type’s own binding

to_source_name (CHARACTER VARYING, nullable)

the arriving table’s catalog partition, first column of its sql_table key

to_schema (CHARACTER VARYING, nullable)

the arriving table’s SQL schema

to_table (CHARACTER VARYING, nullable)

the arriving table’s SQL name; the binding of the type the field names

constraint_name (CHARACTER VARYING, nullable)

the foreign key connecting the two tables, which is what an author would write into a {key:} element. Its own sql_referential_constraint key is this name under whichever endpoint declares it, which fk_on_from says

fk_on_from (BOOLEAN, nullable)

TRUE when the departing table declares the foreign key, FALSE when the arriving one does; the hop’s direction, and what completes the constraint’s key from the two endpoint triples

candidates (INTEGER, nullable)

how many foreign keys connect the two tables, this row being one of them; 1 is what the walk requires of a discovery, and a larger number is what its own "which foreign key did you mean" rejection counts. Stated as a column rather than left to each reader’s count, because whether the discovery is certain decides the reading and a reader that counted for itself would be re-deriving the resolution’s arity

intent_field_reference_step_fanout (view)

Where a field-site @reference path passes through an intermediate table, and whether that table can hold more than one row per pair of columns the entering and leaving hops bind: one row per intermediate, in a closed verdict vocabulary of four. For example film to film_actor to actor draws one row at position 0 reading COVERED, film_actor_pkey being exactly the pair the two hops bind, while a junction carrying a key column neither hop binds reads FANS_OUT there instead.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from the walk the two elements come off

type_name (CHARACTER VARYING, nullable)

the type owning the field the @reference is applied to

field_name (CHARACTER VARYING, nullable)

the field the @reference is applied to

ordinal (INTEGER, nullable)

the owning @reference application’s ordinal, since the directive is repeatable

position (INTEGER, nullable)

the entering element’s 0-based position within its application’s path, completing the grain. The intermediate is the table that element arrives at and the element after it departs from, so a path’s last element is no intermediate and yields no row: that is the terminal-hop exemption falling out of the shape rather than being written as a case

verdict (CHARACTER VARYING, nullable)

what the pair-coverage question answered at this intermediate, a closed vocabulary of four. FANS_OUT where no PRIMARY KEY or UNIQUE constraint on the intermediate has every one of its columns among the ones the two hops bind, so the table may hold several rows per bound pair and a list over the path repeats rows. COVERED where one does, named beside it; the hop is then one row in and one row out. UNDECIDABLE_CONDITION_HOP where the entering or the leaving element joins on an authored Java predicate, whose columns no catalog row names, so one side of the bound set is unreadable. UNDECIDABLE_NAME_MATCH_HOP where one of them departs a table-valued function’s result, which declares no constraint to read. The two undecidable arms are rows rather than silence, so absence on this relation means only that the walk did not resolve the element to one hop: either it reached nothing there, or it reached several candidate routes, which is the ambiguity the walk itself rejects and not a verdict this relation owes; a condition arm on either side wins over a name-match arm on the other, the two being equally declined and the reader needing one value

table_source_name (CHARACTER VARYING, nullable)

the intermediate table’s catalog partition, first column of its sql_table key

table_schema (CHARACTER VARYING, nullable)

the intermediate table’s SQL schema

table_name (CHARACTER VARYING, nullable)

the intermediate table’s SQL name: the table the entering element arrives at and the leaving element departs from

covering_constraint_name (CHARACTER VARYING, nullable)

the PRIMARY KEY or UNIQUE constraint on the intermediate whose every column the two hops bind, which is what makes the hop 1:1 on that pair; the lowest such name where several answer, and NULL under every verdict but COVERED. The subset runs this way round and not the other: a constraint pins a row only when the join knows a value for each of its columns, so an FK on one column inside a two-column UNIQUE clears nothing

source_name (CHARACTER VARYING, nullable)

the document the @reference application is written in, so a message underlines what the author wrote rather than the field

source_line (INTEGER, nullable)

source line of the @reference application, 1-based per the graphql-java convention

source_column (INTEGER, nullable)

source column of the @reference application, 1-based per the graphql-java convention

intent_field_routine_method (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. The generated call surface a @routine application names: graphitron_routine_entry resolved through graphitron_spelled_table and onto sql_routine, one row per call surface the application matches. The sibling of intent_field_producer_method, and the same shape for the same reason: an authored coordinate reaching into a census is a use-keyed resolution over a source-keyed relation, and it states the resolution alone. How a written name meets the catalog is the spelling view’s rule, stated once there; that a @routine(name:) resolves under it is that view’s own claim, jOOQ modelling a function result as a catalog table. Keyed on the application rather than the field, because @routine is repeatable and the ordinal is what tells two applications on one field apart, in the written order the table chain interleaves them in. No table_type filter: a spelling naming a stored table resolves on the spelling view and then matches no row here, so the join says "not a callable" without restating what sql_table.table_type means. Absence has three causes and the joins separate them: no spelled-table row means the name matched no catalog object at all, a spelled-table row with no routine row means the object it matched is not callable, and a routine whose generated model exposes no call surface is excluded here, because this relation is the call surface and naming a class that does not exist would be a worse answer than naming nothing. Ambiguity is rows and never a decline, as on intent_bound_table.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from graphitron_routine_entry

type_name (CHARACTER VARYING, nullable)

the applying field’s owning type

field_name (CHARACTER VARYING, nullable)

the applying field’s name within the owning type

ordinal (INTEGER, nullable)

the @routine application’s own ordinal, carried from graphitron_routine_entry; the fourth key part, because a field may carry several applications and each resolves on its own

source_name (CHARACTER VARYING, nullable)

the resolved routine’s catalog partition, the first column of the sql_routine key this row names; the partition the graph reached through the spelling view’s own scoping

table_schema (CHARACTER VARYING, nullable)

the resolved routine’s SQL schema; what tells two candidates of one spelling apart

routine_name (CHARACTER VARYING, nullable)

the resolved routine’s SQL name. With the two columns above this is sql_routine’s full key

class_name (CHARACTER VARYING, nullable)

the generated Routines class carrying the call surface, from sql_routine.routines_class_fqn. Never null: a routine the generated model exposes none for has no row here at all

method_name (CHARACTER VARYING, nullable)

the Routines-class method an emitted FROM clause calls, from sql_routine.routines_method_name. Never null, on class_name’s terms, the two being null together in the census

parameters (INTEGER, nullable)

how many IN parameters that method takes: the count of sql_routine_parameter rows for the routine, which is the call surface’s arity. A fact about the generated method, so it is the answer whether or not the consumer’s generated sources were ever scanned as a classpath entry, which they ordinarily are not. 0 is an honest arity here and not a fallback, a routine with no parameters and one whose surface the model does not expose being separated by the row’s existence rather than by this column

candidates (INTEGER, nullable)

how many call surfaces this one application resolves to, this row being one of them; 1 on an unambiguous one. Partitioned by the application, as intent_field_producer_method partitions by the reference, and stated as a column on intent_bound_table.candidates' terms: whether the resolution is unique is what decides the reading

intent_field_separate_fetch (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. Which fields are fetched by a statement of their own rather than projected out of the enclosing SELECT, one rule literal per arm. The question a schema author asks about round-trips: a field with no row here that resolves against its parent’s table costs nothing beyond the parent’s own statement, while a field with one is a second trip to the database. The two marker arms are the delivery-forcing union the table-backed child arm reads (@splitQuery defers the fetch through a DataLoader; @tenantFanOut forces the same boundary because a fanned child runs once per tenant and cannot join into a parent statement running on one source), stated as separate rules rather than one DELIVERY_MARKER because which marker forced the split is what an author reads and the two are written for different reasons. The service arm is the non-root @service contract: the service fetches independently of the parent’s SELECT, which is why the split is required rather than optional there. The root arm is every field of a bound root operation type, whose fetch is the operation’s own entry point and never a projection of anything; keyed by the root operation binding rather than the conventional names, so it states the intended rule the way the demand rules do, today’s walk dispatching on the literal names being the same known difference recorded there. The record-handed-parent arm is the implicit split, the one no author writes: a field of a type the backing closure grounds on a class, naming a type of its own that is bound to a table. There is no enclosing statement for such a field to be projected out of, the parent’s value being a Java object a producer handed back rather than a row of a running select, so the child’s table is a trip of its own. It reads intent_type_backing_class rather than the coalesced intent_type_backing, and anti-joins the parent’s own @table binding away, because a type both populations answer is one the walk reads as a table row and never as a handed object; that precedence is the one intent_type_backing’s comment records, so transcribing it is the same reading rather than a new opinion. The anti-join is over intent_bound_table and not over the coalesced view’s table arm, because what makes a parent a table row is its binding, whether or not jOOQ generated a record class for the table the binding names. Both joins over that binding stay on the @table population rather than moving to graphitron_resolved_type_binding as the navigation relations did, and that is a deliberate hold rather than an oversight: a type standing for a @routine chain’s result is handed to its children by the routine’s own statement, so whether such a parent is a table row or a handed row is the same precedence question this arm exists to state, and answering it by substituting the relation would decide it in passing. The two joins move together when it is settled. The parent’s kind is guarded and the child’s is not: the closure holds input objects beside objects and an input coordinate is not a fetch, while on the child side @table on an input object is unreachable from an object’s field to begin with. The literal is the walk’s own trigger name, so one population keeps one word wherever it is stated; record there means a producer-handed domain object, which this schema calls a class backing. Two readings depart from today’s walk and both are the intended rule. An ambiguously bound child splits here where the walk mints no table-backed verdict for it at all, since an ambiguous binding is contested rather than projected, and the split is what an editor can say about a schema mid-edit; a reader wanting the walk’s reading filters on intent_bound_table.candidates the way every other reader of that arity does. A @table interface child splits at either cardinality where the walk inlines the single-valued one, its discriminated-interface arm running before its record-handed one. Two populations stay absent, which is why absence is still not the complement’s claim: a child reached through a connection wrapper, no relation naming a connection’s element type, and the polymorphic fan-in, where a list-valued interface or union child with a table-bound participant batches through a DataLoader. A reader may say a field with a row is separately fetched, and may not say a field without one is inlined.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried through from every arm’s base relation

type_name (CHARACTER VARYING, nullable)

the separately fetched field’s owning type

field_name (CHARACTER VARYING, nullable)

the separately fetched field’s name within the owning type

rule (CHARACTER VARYING, nullable)

why the fetch is its own; a closed vocabulary (SPLIT_QUERY, TENANT_FAN_OUT, SERVICE, ROOT_OPERATION, RECORD_HANDED_PARENT) the reading side decodes into a typed value. A coordinate several rules cover is several rows, the arity being the answer rather than a precedence this view picks; each rule’s witnesses live one join away in the arm’s base relation, so no arm’s witness columns go nullable on the others

intent_field_unlowerable_ordering (view)

Where an ordering is available at a coordinate and the coordinate’s own read shape cannot honour it: one row per coordinate and availability route, in a closed verdict vocabulary of two. For example a child field returning a three-implementation multitable interface and carrying both @defaultOrder and an @orderBy argument draws two rows under PARTICIPANT_FAN_OUT, one per route, while the same field with no declaration at all draws none.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from the read-shape relation the row’s verdict came off

type_name (CHARACTER VARYING, nullable)

the type owning the coordinate whose ordering goes unlowered

field_name (CHARACTER VARYING, nullable)

the coordinate’s field name; with the type above and the two vocabulary columns below, the grain

verdict (CHARACTER VARYING, nullable)

which read shape cannot honour the ordering, a closed pair: PARTICIPANT_FAN_OUT where the coordinate is read as one statement per participant of a multitable container and the branches are combined on a synthetic key, so no branch carries the declaration; KEY_CAPTURE_SCATTER where a mutation-root @routine write returns a list, its visible rows being the captured keys re-read by a keyed SELECT that sorts by nothing. Disjoint by construction rather than by precedence, a mutation-root routine write taking no PARTICIPANT_TABLE row

available_via (CHARACTER VARYING, nullable)

which route made an ordering available at the coordinate, a closed triple: DEFAULT_ORDER for a field-level @defaultOrder, ORDER_BY_ARGUMENT for an @orderBy on one of the field’s arguments, PRIMARY_KEY_FALLBACK for the target table’s primary key the resolver supplies where nothing is written. Part of the grain and not provenance: a coordinate with two routes is two rows because each remedy names one route, and a consumer that folded them would have to word one remedy for two different things the author did

argument_name (CHARACTER VARYING, nullable)

the argument carrying the @orderBy on the ORDER_BY_ARGUMENT route; NULL on the other two, which are declared at the field or at nothing. In the grain because graphitron_order_by_entry is keyed at argument grain, so two @orderBy arguments on one coordinate would otherwise collide on one row. Unreachable today, the ordering resolution taking the first such argument it finds, but a relation’s grain is not the place to inherit a consumer’s first-match precedence

source_name (CHARACTER VARYING, nullable)

the document the declaring directive is written in, so a message underlines the directive rather than the field; the field’s own document on PRIMARY_KEY_FALLBACK, where there is no directive to point at

source_line (INTEGER, nullable)

source line of the declaring directive, 1-based per the graphql-java convention; the field’s own on PRIMARY_KEY_FALLBACK

source_column (INTEGER, nullable)

source column of the declaring directive, 1-based per the graphql-java convention; the field’s own on PRIMARY_KEY_FALLBACK

intent_field_unlowerable_ordering_rejection

The rejection each minting row of intent_field_unlowerable_ordering carries: one row per rejected coordinate and availability route, holding the sealed Rejection hierarchy’s verdict on it and the message a report would print. For example the multitable root carrying @defaultOrder draws a DEFERRED row whose message names the interface, its participants and both remedies, while a list-returning @routine write draws none, its rejection being held.

Primary key: (graph_name, ordinal). Foreign key: (graph_name) references store_graph (graph_name). Check: "KIND" = 'DEFERRED'.

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

ordinal (INTEGER, not null)

mint order over the graph’s rejected routes, 0-based; the key’s tie-breaker on intent_authored_claim_rejection.ordinal’s convention, which this relation needs because its natural key carries a NULL on the two non-argument routes where a key may not

type_name (CHARACTER VARYING, not null)

the rejected coordinate’s owning type, joining intent_field_unlowerable_ordering’s own

field_name (CHARACTER VARYING, not null)

the rejected coordinate’s field name; never NULL, this family having no type grain

available_via (CHARACTER VARYING, not null)

the availability route this rejection words, joining the view’s own column; carried because the view is keyed per route and the remedy differs by route

argument_name (CHARACTER VARYING, nullable)

the declaring argument on the ORDER_BY_ARGUMENT route, NULL on the other two; the rest of the view’s key, so the join to it cannot fan

kind (CHARACTER VARYING, not null)

RejectionKind.name() for the minted rejection, a closed CHECK over the one value this family can reach: DEFERRED, the schema being well formed and the remedy being to drop the declaration or wait for the lowering. Minted rather than mapped from the verdict in SQL, because the projection is RejectionKind’s and a CASE restating it here would be a second copy of a fork the hierarchy already owns

variant (CHARACTER VARYING, not null)

the minted rejection leaf’s class name with its package stripped, enclosing classes kept, on intent_authored_claim_rejection.variant’s spelling rule and through the same one Java site

message (CHARACTER VARYING, not null)

the violation’s full report message, coordinate prefix included, byte-identical to what the report carries for this family; display material, never a dimension

intent_foreign_key_column_pair (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. What a foreign key equates: one row per position, the key’s own column beside the column it references. The join condition every reader that renders or reasons about a foreign key needs, and a derivation rather than a capture because the census records the two constraints' column lists separately and the pairing between them is positional. Positional is the whole content of this relation and it is SQL’s own rule rather than a convention adopted here: a foreign key’s Nth column references the Nth column of the constraint it points at, which is why sql_constraint_column carries a position at all and why nothing else has to be matched on a name. Both sides are joined on their own constraint’s full key, so a constraint name two schemas or two classpath entries both declare pairs within its own table and never across, which is the collision the endpoint triples exist to prevent. A key whose referenced constraint has fewer columns than it declares pairs only the positions both sides hold, and that is a malformed catalog rather than a shape to model: the census would have to have recorded a key SQL could not have created. No arity is exposed beside the pairs, the position being dense from zero on both sides, so a reader wanting the width counts rows. Nothing here is specific to any one consumer’s question, which is why it sits with the catalog derivations and not beside the relation that first needed it: the @nodeId lift is its first reader and a rendered join is its obvious second.

Columns
source_name (CHARACTER VARYING, nullable)

the declaring table’s catalog partition, as on sql_referential_constraint

table_schema (CHARACTER VARYING, nullable)

the declaring table’s SQL schema

table_name (CHARACTER VARYING, nullable)

the declaring table’s SQL name: the table the foreign key sits on, which is the child end of the relationship

constraint_name (CHARACTER VARYING, nullable)

the foreign key’s name under the declaring table, completing sql_referential_constraint’s key with the three columns above

position (INTEGER, nullable)

0-based position within the key, dense from zero, shared by both sides of the pair; the order a tuple predicate over the key has to preserve

column_name (CHARACTER VARYING, nullable)

the key’s own column at this position, on the declaring table. The catalog’s own spelling, so a reader matching it against an authored one folds the authored side

referenced_source_name (CHARACTER VARYING, nullable)

the referenced table’s catalog partition

referenced_schema (CHARACTER VARYING, nullable)

the referenced table’s SQL schema

referenced_table (CHARACTER VARYING, nullable)

the referenced table’s SQL name: the parent end of the relationship, equal to the declaring table on a self-referencing key

referenced_column_name (CHARACTER VARYING, nullable)

the referenced constraint’s column at this position, on the referenced table; the other half of the equality this row states

intent_input_field_column_scope (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. Which table the column name written at an input field resolves against: the input-field twin of graphitron_argument_column_scope and graphitron_field_column_scope, and a third relation for the reason the third walk is a third walk. The departure differs and here it is not even a function of the coordinate, so the resolving table is part of the key and the same input field carries one row per table it is classified against. Two rules, disjoint rather than ranked, so this is a plain union with no windowed collapse over it and it carries the one-row-per-site property both twins stand on. An authored @reference path resolves to its terminal element’s table, demanding the terminal reach exactly one table rather than exactly one row, so an element joining two tables by three keys still names its destination; the DISTINCT over a projection keeping only the table is what collapses several routes to one destination. An input field with no path element resolves in the table it was handed, read from graphitron_input_field_resolving_table rather than restated, so the two spellings of that departure cannot drift. Repetition is a conflict and not a chain, as at the argument site and unlike at the output-field site: ordered composition has no meaning on an input field, the resolver rejects a second application outright, and a site carrying two has no row here under either rule. That second demand is on the applications and not on their elements, so an author writing an empty @reference(path: []) beside a real one has no row here, and an author writing one empty application alone has the resolving-table row, which is the bare predicate a directive-less field would have produced and is what the resolver gives that site. Nothing here reads the classifier’s ordered fork. A @notGenerated or @lookupKey application, a @nodeId decode, a nested input object and a plain name all have a scope, and which of them the classifier actually resolves the site as is a role question one rung up; this relation answers where a name would resolve if one is written, which is graphitron_argument_column_scope’s stance at its own site. Its consumer is graphitron_input_field_column_match, which asks which column the name reaches.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from both rules' base relations

type_name (CHARACTER VARYING, nullable)

the input object type the field is declared on. Not the type whose binding started any navigation, an input object having none, which is the difference from the output-field twin where the two are one

field_name (CHARACTER VARYING, nullable)

the input field whose site this row resolves

resolving_source_name (CHARACTER VARYING, nullable)

the catalog partition of the table the site was classified against; part of the grain, so a shared input type reached from two tables gets a row for each

resolving_schema (CHARACTER VARYING, nullable)

the classifying table’s SQL schema; part of the grain, as above

resolving_table (CHARACTER VARYING, nullable)

the classifying table’s SQL name; with the two coordinate columns and the two columns above, the grain. Equal to the resolved table on the RESOLVING_TABLE rule and the walk’s departure on the other

basis (CHARACTER VARYING, nullable)

which rule resolved this site, in a closed vocabulary of two disjoint rules: PATH_TERMINAL (an authored input-field @reference path’s terminal element), RESOLVING_TABLE (no path element written, the table the classifier was handed). Also the fork a predicate binding takes, PATH_TERMINAL being exactly the case where the resolved table is not the one the consuming field already selects from

table_source_name (CHARACTER VARYING, nullable)

the resolved table’s catalog partition, the first column of the sql_table key this row names

table_schema (CHARACTER VARYING, nullable)

the resolved table’s SQL schema

table_name (CHARACTER VARYING, nullable)

the resolved table’s SQL name. With the two columns above this is sql_table’s full key, so the table’s columns are one join away

intent_input_occurrence_descent_order (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. The order the flattener reaches a payload’s occurrences in, one row per occurrence path: a dense zero-based rank within the argument the path descends from. The walk is a depth-first pre-order over declared input fields, so the argument occurrence itself is always rank zero, a grouping input is reached before any field it groups, and a grouping input’s whole subtree lies between it and its next sibling. Two questions already asked that order pairwise, each in its own view body, and both are the same question: which of several contending straddler claims pins a key column, which graphitron_mutation_write_destination settles, and which occurrence a runtime agreement check names on its predicate side, which intent_mutation_write_agreement settles. A third is the order an emitter renders one statement’s assignments and predicates in, and it is what fixes the grain: all three are questions about an occurrence’s place in one descent, so the order is stated once at the grain of the occurrence rather than three times inside the relations that consume it. The rank is computed pairwise rather than from a sort key assembled out of the path, a key of that shape being a collection folded into one value and this schema keeping no such column: for each pair of occurrences under one argument, the earlier is the one that is a prefix of the other, or, where neither is, the one whose field is declared first at the outermost step the two differ at. That comparison tests field names only and does not compare containers, and does not need to: two paths agreeing on every field name before their first difference agree on every container too, each step’s container being the previous step’s named type and the first being the argument’s own input type, so the containers follow by induction rather than by a predicate. The order is total within an argument, which is what makes the rank dense: two distinct paths under one argument either stand in the prefix relation or take different fields at some step, and different fields on one container have different declaration ordinals. Between arguments it says nothing. Two paths under different arguments both have a rank and the two ranks are not comparable, which is why the argument is not repeated here: a reader needing it joins intent_input_occurrence_path, whose key this relation shares and whose row carries the argument coordinate. Absence is an occurrence path relation with no rows, so a graph declaring no input object surface at all; every path that exists has a rank, the payload root included.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from the occurrence path; the leading key dimension that keeps one workspace’s graphs apart

path (CHARACTER VARYING, nullable)

the occurrence this rank is about; with graph_name, the key intent_input_occurrence_path is keyed by, which is what a reader joins on

ordinal (BIGINT, nullable)

zero-based position of the occurrence in its argument’s descent, dense within that argument: the argument occurrence itself is zero, a grouping input precedes every field it groups, and siblings follow their declaration order. Comparable only against another rank under the same argument.

intent_input_occurrence_override (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. The cascade fact as a predicate over path prefixes: one row per occurrence path with an enclosing @condition(override: true), which in the classification walk is the enclosingOverride boolean threaded through the recursion. A path’s enclosing sites are the use-site field’s own @condition, the argument’s @condition, and the @condition of every step strictly above the leaf (the leaf’s own override is the condition-owned carrier’s fact, not a cascade fact). Absence is the no-override reading, which is what the use-keyed cascade verdict fires on when the leaf is unbound. The witness columns name the nearest enclosing overriding site (deepest step first, then the argument, then the field), the row the admitted-because message and the future fix-it need; a NULL argument name means the witness is a field-site condition row, the witness’s own key shape across the two condition relations.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from the path

path (CHARACTER VARYING, nullable)

the overridden occurrence path

override_type_name (CHARACTER VARYING, nullable)

witness: the overriding @condition site’s owning type (an input object type for a step witness)

override_field_name (CHARACTER VARYING, nullable)

witness: the overriding site’s field name

override_argument_name (CHARACTER VARYING, nullable)

witness: the overriding site’s argument name; NULL when the witness is a field-site condition (graphitron_field_condition_entry’s key shape), non-NULL when it is the argument-site relation’s row

intent_input_occurrence_path

One occurrence of the input surface under a use site: an argument whose named type is an input object, or a nested input field reached from one by descending through input-object-typed fields. For example Mutation.updateFilm(in: FilmUpdateInput!) draws one row for the in argument at depth 0 and one for each of its fields, filmId and title, at depth 1.

Primary key: (graph_name, path). Foreign key: (graph_name) references store_graph (graph_name). Foreign key: (graph_name, root_type_name, root_field_name, root_argument_name) references graphql_argument_element (graph_name, type_name, field_name, argument_name).

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

path (CHARACTER VARYING, not null)

the serialized occurrence path; the value key

root_type_name (CHARACTER VARYING, not null)

the use site’s owning type

root_field_name (CHARACTER VARYING, not null)

the use site’s field name within the owning type

root_argument_name (CHARACTER VARYING, not null)

the argument this occurrence descends from

root_input_type (CHARACTER VARYING, not null)

the argument’s named input object type, the traversal’s entry type

leaf_named_type (CHARACTER VARYING, not null)

the named type of the path’s last step (the argument’s own type at depth 0); the expansion descends from here when the type has kind INPUT_OBJECT and is not already visited on the path

depth (INTEGER, not null)

the number of input-field steps below the argument; 0 for the argument occurrence itself, and equal to the highest step ordinal otherwise

intent_input_occurrence_path_step

The ordinal-keyed decomposition of an occurrence path: one row per input-field step, 1-based, so no consumer parses the serialized key. For example the path reaching title under Mutation.updateFilm(in:) draws one row at ordinal 1 naming FilmUpdateInput.title.

Primary key: (graph_name, path, ordinal). Foreign key: (graph_name, path) references intent_input_occurrence_path (graph_name, path). Foreign key: (graph_name, container_type_name, field_name) references graphql_field_element (graph_name, type_name, field_name).

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored through the parent path; the leading key dimension that keeps one workspace’s graphs apart

path (CHARACTER VARYING, not null)

the owning occurrence path

ordinal (INTEGER, not null)

1-based position of this input-field step below the argument

container_type_name (CHARACTER VARYING, not null)

the input object type this step’s field is declared on

field_name (CHARACTER VARYING, not null)

the input field’s name within its container

named_type (CHARACTER VARYING, not null)

the step’s named type; the type the traversal is in after taking this step

intent_mutation_matched_key (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. Whether a write payload identifies the row it acts on, and through which key. One row per write surface whose payload the walkers admit entirely, which is the population both walkers reach this question at: they collect every per-field refusal first and return before matching a key, on the grounds that an unadmitted field makes the covered set unreliable and a spurious coverage error on top of a real field error helps nobody. So a mutation with any refusal has no row here at all, and that absence is the refusal relation’s to explain rather than a verdict of its own. The match itself is verb-neutral and is the one thing the two walkers genuinely share: which catalog key does this input cover. The candidates and their order are intent_table_key_candidate’s, primary key first and then the unique keys in declaration order with duplicates on the column set already collapsed, so the primary key being the tiebreaker is that relation’s ranking read in ascending order rather than a preference invented here. Covered means every column of the key is one this payload contributes, which is a subset test and not an equality: an input naming more columns than a key needs still covers it, and the surplus is the other consumer’s business. The subset test is counted rather than correlated, the key’s columns outer-joined to the payload’s and the two counts compared, so the contributed columns are read once for the whole matrix instead of once per key column per candidate per surface. That shape also keeps the degenerate reading honest: a candidate with no columns at all compares zero against zero and is covered, which is what a subset test over an empty set does and what the matcher this transcribes would answer. No catalog jOOQ generates produces such a key, so it is a property of the rule rather than a population. What is not verb-neutral is the covered set, and that is the whole reason the verb is on the row. A DELETE counts every admitted column, every one of them being a WHERE predicate. An UPDATE counts only the columns of carriers that pin identity, which is every carrier except a self-referencing foreign key: a self-FK’s columns point at a sibling row, so a key column reachable only through one is not this row’s identity and an UPDATE that treated it as such would key on the wrong row. Stated as a predicate over the carrier role rather than as two relations, because the question and the ranking are identical and only the input to the subset test moves. A closed vocabulary of three. IDENTIFIED names the winning key and carries its rank and whether it is the primary, which is what a consumer emitting the WHERE clause and a diagnostic naming the key both need. BROADCAST is the DELETE that covered nothing and opted in: multiRow: true is the author saying the statement may match many rows, and it is an arm rather than a modifier because the emitted statement has no key predicate at all. UNCOVERED is everything else, and it is a rejection’s population: an UPDATE has no broadcast reading, multiRow: true on one being refused before a write surface exists at all, so an UPDATE whose input pins no key is an author error with the covered columns and the candidate keys as its evidence, both one join from this row. The three key columns are null together and exactly on the two verdicts that name no key, which is the vocabulary determining them rather than an unfilled slot. What this relation does not say is what happens to the columns the key did not take. On a DELETE nothing does, every admitted column being a predicate and the key being a cardinality guard beside them rather than a subset of them. On an UPDATE the key is a partition, and where each remaining column lands, whether a carrier straddles the key, and whether anything is left to set at all are the write destination’s answers over the same substrate this one reduces.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from the write payload

type_name (CHARACTER VARYING, nullable)

the type owning the mutation field

field_name (CHARACTER VARYING, nullable)

the mutation field this verdict is about; with the column above and the graph, the grain, one row per write surface

operation (CHARACTER VARYING, nullable)

the verb, UPDATE or DELETE. Not provenance: it selects the covered set the match ran over and it gates the broadcast arm

multi_row (BOOLEAN, nullable)

the @mutation(multiRow:) spelling, carried from the write payload. False on every UPDATE row by construction, that spelling being refused there before a write surface exists

verdict (CHARACTER VARYING, nullable)

IDENTIFIED, BROADCAST or UNCOVERED, a closed vocabulary of three. A fourth outcome is a new value here rather than a silence

write_source_name (CHARACTER VARYING, nullable)

the catalog partition of the table the write targets, and the table whose candidate keys were ranked

write_schema (CHARACTER VARYING, nullable)

the write table’s SQL schema

write_table (CHARACTER VARYING, nullable)

the write table’s SQL name; with the two columns above, sql_table’s full key

constraint_name (CHARACTER VARYING, nullable)

the winning key’s constraint name on that table; NULL on the two verdicts that name no key. With the three table columns above, intent_table_key_candidate’s key, so the key’s own columns are one join away

primary_key (BOOLEAN, nullable)

whether the winning key is the table’s primary key rather than a unique one; NULL where no key won. Carried because a diagnostic and an emitted comment both read differently for the two

candidate_rank (INTEGER, nullable)

the winning key’s 0-based rank among the table’s candidates, carried so a reader can see how far down the order the match had to go without re-ranking; NULL where no key won

source_name (CHARACTER VARYING, nullable)

the @mutation application’s own declaration file; the position a coverage diagnostic would carry

source_line (INTEGER, nullable)

source line of the @mutation application, 1-based

source_column (INTEGER, nullable)

source column of the @mutation application, 1-based

intent_mutation_routine_seat (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. Which seat a mutation root’s @routine occupies, and where it occupies none, which precondition stopped it. A @routine on a mutation root is a write, and there are exactly two shapes the write can take: the chain seat, where @reference elements after the routine say where the committed row is re-read from, and the carrier seat, where the field returns a payload whose one data field re-reads it by the routine result’s name-matched keys. Which of the two the author wrote for is the seat, and whether that seat holds is the verdict, and they are separate columns because a refused coordinate still has a seat and a diagnostic about it has to name the shape the author was aiming at. Population: every mutation-root field carrying @routine, at the application that defines the chain. Total over that population and exactly one row per coordinate, which is the property the whole relation is for: there is no default arm and no coordinate with no row, so a shape this vocabulary cannot name is a build failure here rather than a silent non-member somewhere downstream. A reduction over sibling relations rather than a rule of its own: every fact it turns on is already a relation, intent_field_chain_terminus and intent_field_chain_node for where the chain goes, graphitron_carrier_data_field and intent_carrier_routine_hop for what the payload is and where its re-read departs from, intent_bound_table for what the author wrote @table for, and the captured directive rows for what was written. What this relation adds is the seat fork and the precedence, and nothing else; a verdict that needed a fact no relation states would be a rule wearing a reduction’s name, and the two the walk distinguishes that no relation states are disclosed below rather than fabricated here. One pass with the verdict picked by a CASE rather than one UNION ALL arm per verdict, which is intent_node_id_decode_defect’s rule for the same reason and additionally for this one: exactly-one-verdict-per-coordinate is what a reader trusts, and one driving row gives it by construction where a union would have to rank arms to get it back. The nesting is the seat fork, so the two seats' arms cannot reach each other. Precedence is this relation’s own and not a transcription of any evaluation order: a coordinate with two defects gets the more fundamental one, the count of routine nodes before the chain’s head, the head before the surface written on it, the surface before anything about the return, and the return’s shape before where the chain lands. There is no message column, on intent_node_id_decode_defect’s settled terms: the closed vocabulary plus the coordinate and the return type are the fact base, and the prose that renders a verdict as a sentence an author can act on belongs with the consumer that composes it. Nor a severity column, which would be a function of the verdict and nothing else; which verdicts are the author’s to fix and which are shapes the generator owes an emitter is stated per value below. The terminus rule reads intent_bound_table and not graphitron_resolved_type_binding, and the choice is load-bearing rather than inherited: the reduction’s other arm is intent_routine_return_binding, which binds a chain field’s return type to that same chain’s terminus, so comparing the terminus against the reduction would be comparing a value with itself. What the rule is actually about is whether the table the author wrote @table for is where the chain lands, which is the @table population’s question alone; this is graphitron_node’s reason for standing on that arm too. A return type carrying no @table therefore draws no disagreement, the derived binding governing there, which is the shipped behaviour and not an omission. One silence is disclosed rather than closed, and one that was is now shut. A first hop that joins by an authored condition alone resolves through graphitron_condition_method_route, so the chain reaches its first node and this relation reads the shape as UNANCHORED_FIRST_HOP, which is the verdict this relation’s own precedence already assigns that shape: a chain node at seq 1 whose captured step names a condition class. It read as CHAIN_UNRESOLVED for as long as such a hop resolved to no hop row at all, which conflated a refusal with a shape the classification walk calls owed an emitter. The one that stays disclosed: a payload whose data field is the ID scalar draws no graphitron_carrier_data_field row at all, that relation refusing an ID element for the ROUTINE family outright, so it reads as NO_CARRIER and CARRIER_ELEMENT_NOT_TABLE names the record element alone.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from the @routine application

type_name (CHARACTER VARYING, nullable)

the mutation root type the field sits on, bound by graphql_root_operation at MUTATION rather than by the literal name Mutation, on the demand rules' terms

field_name (CHARACTER VARYING, nullable)

the mutation field the @routine is written on; with the type above, the coordinate the write runs at and a located refusal attaches to

ordinal (INTEGER, nullable)

the chain-defining @routine application’s own ordinal, which is the greatest on the field; joins back to graphitron_routine_entry on it. The selection is intent_field_chain_start’s rule reached without its resolution, spelled again here for a reason that relation cannot serve: this population must hold a row where a routine name resolves to nothing, and there it has none

seat (CHARACTER VARYING, nullable)

which shape the field’s applications were written for, a closed two-value domain. CHAIN: the field carries at least one @reference, so the routine call is the write and the chain’s terminus is where the post-commit re-read runs. CARRIER: it carries none, so the return is a payload type whose data field owns the re-read and the hop out of the routine result is inferred rather than written. Decided by the presence of an @reference application and by nothing else, which is why it is a fact about the coordinate rather than a verdict: a refused coordinate has a seat too, and the two seats' verdicts are disjoint vocabularies below the three shared ones

verdict (CHARACTER VARYING, nullable)

whether the seat holds, and where it does not, which precondition stopped it, in a closed vocabulary of fourteen. ADMITTED is the one emitting value and means the seat’s whole predicate holds; what such a coordinate emits is the seat column’s to say. Three refusals are shared by both seats. MULTIPLE_ROUTINE_NODES: more than one @routine is written on the field, which is a shape owed the multi-lateral emit; it precedes every other verdict because the rules below are stated about the chain’s one routine and there is no one routine here. CHAIN_HEAD_NOT_ROUTINE: an @reference is written before the routine, so the chain would depart from something other than the function result, which at a root there is nothing to be. READ_SURFACE_ON_WRITE: the field or one of its arguments carries @condition or @orderBy, and neither write seat has a filter or an ordering to resolve them against, so admitting the coordinate would classify the directives clean and then silently do nothing. Five are the chain seat’s. REFERENCE_ON_CARRIER_RETURN: the return carries no @table and is a routine payload carrier, so the path is the right fact at the wrong grain and its seat is the payload’s data field. CONNECTION_RETURN: @asConnection rewrote the field’s type expression, and the write’s re-read is keyed by the captured routine columns rather than paginated. CHAIN_UNRESOLVED: the chain does not land on exactly one table, which covers a routine name resolving to no function result, a walk that stopped short of the written tail, and a step reaching its destination by more than one route; which of the three it is is readable on intent_field_chain_node at this row’s own coordinate. UNANCHORED_FIRST_HOP: the first hop out of the routine result carries an authored condition, whose predicate names the routine alias and so cannot appear in the follow-up query, leaving the re-read no anchor. TERMINUS_NOT_RETURN_TABLE: the return type’s @table names a table the chain does not land on, or names one ambiguously. Five are the carrier seat’s. TABLE_BOUND_RETURN: the return is @table-bound with no @reference to walk, which is the chain shape minus its chain and has no re-read anchor either. NO_CARRIER: the return is neither table-bound nor a payload declaring exactly one data channel of the routine family, which is graphitron_carrier_data_field’s arity and its whole set of refusals reported as one. CARRIER_ELEMENT_NOT_TABLE: the one data channel is a record element, and a routine write re-reads its committed row from a catalog table. CARRIER_DATA_FIELD_NON_NULL: the data channel is a non-null single, so a re-read a read policy legitimately returns no row for would null the whole payload through non-null propagation and destroy the errors list beside it. CARRIER_HOP_UNRESOLVED: no hop runs from this field’s own routine result to the data field’s table, or one does and the pairing it would key on comes up short of the arrival’s key, which is sql_name_matched_key_column’s shortfall stated as rows and demanded here as the reader’s own gate, intent_carrier_routine_hop naming the two ends and never claiming they can be keyed. Of the fourteen, the ones an author fixes in their own schema are CHAIN_HEAD_NOT_ROUTINE, REFERENCE_ON_CARRIER_RETURN, TERMINUS_NOT_RETURN_TABLE, CARRIER_ELEMENT_NOT_TABLE, CARRIER_DATA_FIELD_NON_NULL and CARRIER_HOP_UNRESOLVED; MULTIPLE_ROUTINE_NODES, READ_SURFACE_ON_WRITE, CONNECTION_RETURN, UNANCHORED_FIRST_HOP and TABLE_BOUND_RETURN are shapes the generator owes an emitter; CHAIN_UNRESOLVED and NO_CARRIER are each of both kinds and the witness relation tells them apart

return_type_name (CHARACTER VARYING, nullable)

the type the field returns, read off intent_field_navigated_type, so a connection-returning field names its element whether the generator synthesised that connection or the author declared it. On a CHAIN row this is the type the chain’s terminus stands for; on a CARRIER row it is the payload, and the key into graphitron_carrier_data_field for the data channel this seat’s re-read runs at. Never the table: what table stands for the type is intent_bound_table’s and intent_field_chain_terminus’s to say, and repeating it here would be a denormalisation of facts this row’s own columns already reach

source_name (CHARACTER VARYING, nullable)

the schema document the @routine application is written in, carried from graphitron_routine_entry so a located refusal needs no join back to the population

source_line (INTEGER, nullable)

source line, 1-based per the graphql-java convention

source_column (INTEGER, nullable)

source column, 1-based per the graphql-java convention. With the line and the document name, the site a refusal points an author at, which is the directive and not the field, every verdict here being about what the @routine composes with

intent_mutation_write_agreement (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. Which two of an UPDATE’s contributions must be checked equal before any DML runs, one row per pair per column. A foreign key forces the two values equal for well-formed input and nothing forces the input to be well formed: both values arrive on the wire independently, so a disagreement is a runtime error and can only be a runtime error, which is why this states an obligation to emit a check rather than a refusal to generate. It is a reduction over graphitron_mutation_write_destination rather than a fact beside it, and the whole of the rule is a self-join and a tie-break: every pair is a PREDICATE row of that relation and a non-PREDICATE row of it over the same column of the same statement. Two carriers reach the non-PREDICATE side and the destination already tells them apart. A self-referencing foreign key routes every column it carries to the assignment half, so a key column among them is written and checked, and its row here carries VALUE. A straddling cross-table reference whose in-key column something else already pins neither filters nor writes it, so its row here carries CHECKED, which is that destination’s whole reason to exist. The predicate side is one occurrence per column even where several are dispositioned PREDICATE, because the statement filters on a column once: where two whole carriers bind one key column, which of them the check names is the flattener’s descent order, read off intent_input_occurrence_descent_order, which is the same rank graphitron_mutation_write_destination settles a contested straddler claim with, and asked here rather than left to whatever order a row arrives in for the same reason it is asked there. A field paired with itself is excluded in the join rather than filtered after it: the check this lowers to names two input fields, and a field cannot disagree with itself, so an occurrence and a same-named occurrence elsewhere in the payload produce no obligation. Absence is every payload with no reference carrier landing on a key column, which is most of them, and every payload the write partition refuses, a refused payload having no destination rows to reduce over. Source positions are not carried: a row here names two occurrences, both of which graphitron_mutation_write_destination already carries a position for at a key this relation states in full, and carrying one of the two would invite it to be read as the obligation’s position, which no author error attaches to. Nor is the order the checks are emitted in carried as a column. That order is the reference occurrence’s place in the flattener’s descent and then its decode slot, which is the order the assignment and predicate halves are themselves emitted in, so it is one question at the grain of an occurrence rather than three at the grain of each partition; the descent half of it is intent_input_occurrence_descent_order, which an emitter joins on the reference path, and the decode slot is reference_position here.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from the write destination

type_name (CHARACTER VARYING, nullable)

the type declaring the mutation field whose statement the check runs before

field_name (CHARACTER VARYING, nullable)

the mutation field; with the type, the coordinate both sides belong to and the statement the check guards

column_name (CHARACTER VARYING, nullable)

the column of the write table both sides supply a value for, and the column whose SQL type the comparison is coerced through

key_path (CHARACTER VARYING, nullable)

the occurrence path of the contributing input field the WHERE clause reads, intent_input_occurrence_path’s key

key_container_type_name (CHARACTER VARYING, nullable)

the input object type the predicate side’s field is declared on, its path’s last step’s container

key_input_field_name (CHARACTER VARYING, nullable)

the predicate side’s field name within that container, the first of the two names a disagreement quotes

key_position (INTEGER, nullable)

the decode slot of the predicate side’s carrier holding this column’s value, counting from zero, and zero for a name match

key_role (CHARACTER VARYING, nullable)

which rule resolved the predicate side’s column, NAME_MATCHED or NODE_ID. It is the one thing about the two sides that varies, the reference side always being a decode, so a consumer deciding which side it can read a decoder off reads this and joins back for nothing

reference_path (CHARACTER VARYING, nullable)

the occurrence path of the reference carrier that supplies the column’s other value

reference_container_type_name (CHARACTER VARYING, nullable)

the input object type the reference side’s field is declared on

reference_input_field_name (CHARACTER VARYING, nullable)

the reference side’s field name within that container, the second name a disagreement quotes; never equal to key_input_field_name

reference_position (INTEGER, nullable)

the decode slot of the reference carrier holding this column’s value. Carried rather than derived because a straddling carrier’s columns are split across the two halves of the statement, after which neither half’s ordering recovers which slot a column came from

reference_destination (CHARACTER VARYING, nullable)

what the reference side’s column is for in the statement, VALUE or CHECKED, carried from graphitron_mutation_write_destination. VALUE is the self-referencing foreign key, which writes the column as well as being checked on it; CHECKED is the straddler that does neither. A consumer emitting the assignment half reads this to know whether the column is already covered there

write_source_name (CHARACTER VARYING, nullable)

the catalog partition of the table the write targets

write_schema (CHARACTER VARYING, nullable)

the write table’s SQL schema

write_table (CHARACTER VARYING, nullable)

the write table’s SQL name; with the two columns above, sql_table’s full key

intent_mutation_write_refusal (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. Why an UPDATE the walker admitted field by field is refused anyway, once the matched key has partitioned its columns. The third of three refusal relations over one statement and the last in the order the build reaches them: whether each field is admissible at all is graphitron_mutation_payload_refusal’s and is collected before any key is matched, whether the admitted remainder pins a row is the matched key’s UNCOVERED verdict, and what is left is what only the partition can see. A consumer assembling an UPDATE reads all three and stops at the first that answers, in that order. The domain is UPDATE alone, and that is the whole reason these causes exist. A DELETE has no assignment half: every admitted column of one is a predicate, so there is no boundary for a carrier to straddle into, no assignment for two writers to collide over, and nothing that must be non-empty. Four causes in three stages, and the stage is what makes the ranking load-bearing rather than cosmetic. The walker collects a stage’s refusals without short-circuiting and returns at the end of it, so a cause from a later stage on the same coordinate is not merely unreported: it would have been computed over a partition an earlier refusal made the walker abandon. This relation therefore keeps, per coordinate, only the causes of the first stage that has any. The first stage carries the two straddles and reports them together, an author fixing one of them meeting the other. MIXED_CARRIER_KEY_MEMBERSHIP is a carrier of the row’s own columns with a column on each side of the key: half of it is the identity the statement finds the row by and half is a value it writes, which is moving the row rather than updating it. NULLABLE_STRADDLING_REFERENCE is a cross-table reference in the same position, where the split itself is legitimate and so is the spelling, except where the reference is the sole supplier of one of the key’s columns. The in-key half of a straddling reference is the row’s own identity, and an optional field cannot be load-bearing identity: omitted, it leaves the row unidentifiable, and no per-row conditional recovers a predicate that was never sent. Where something else supplies that column the same nullable reference is admitted, and an explicit null on it clears its out-of-key half; a half-null foreign key imposes no referential obligation under MATCH SIMPLE, so the cleared reference is an absent one rather than a dangling one, which is the premise this cause used to be argued from backwards. What counts as supplying it is the identity_pinned window beside the predicate: a whole carrier other than a self-referencing one, or a non-null cross-table straddler lifting the column in its in-key half. The second arm is the one that is easy to drop, and it is what makes this relation agree with the walker: a non-null straddler’s winning claim IS the column’s predicate and a non-null field cannot be absent, so it pins exactly as a whole carrier does. That window is this view’s own and is deliberately wider than the destination’s pinned window beside it, which stays whole-carrier-only: broadening that one would empty its claim step for any column two non-null straddlers lift and silently drop the column’s predicate. The predicate is silent about carrier_key_membership, which is sound but by a subtlety worth writing down rather than tidying away. It also matches a nullable cross-table reference whose columns fall wholly inside the key, and that shape escapes only because the window counts the carrier’s own WHOLE rows and so self-pins. A straddler is never WHOLE and so never self-pins, which is what makes the same window read as some other carrier for the rows this cause is about; the wholly-in-key nullable reference is a neighbouring hazard deliberately left to its own measurement, and a later reader fixing the self-inclusion would refuse schemas that build today. A self-referencing foreign key appears under neither cause, routing wholly to the assignment half before the boundary is consulted. The second stage carries PLAIN_COLUMN_COLLISION, two plain carriers assigning one column, which would silently last-write-win; an overlap one of whose writers decodes its value is admitted instead and reconciled at runtime by the agreement check, which is why the cause is about plain writers rather than about writers. The third carries NO_SET_FIELDS, an UPDATE every column of which is the key it filters on, which is structurally ill-formed rather than a no-op. Where a row is located varies by cause and so do two of its columns, which is the shape of the underlying errors rather than an unfilled slot. A straddle is a fact about one occurrence and names it with no column. A collision is a fact about one column and names every occurrence writing it; the walker’s own diagnostic quotes two of them, which is an artefact of the order it built the assignment half in rather than a fact about the payload, so this relation names the contributors and leaves the choice to whoever renders one. An empty assignment is a fact about the statement and names neither, and its position is the @mutation application’s rather than any field’s. Absence is an UPDATE whose partition the walker accepts, every DELETE, and every coordinate one of the two earlier refusals already answers for.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from the write payload

type_name (CHARACTER VARYING, nullable)

the type declaring the refused mutation field

field_name (CHARACTER VARYING, nullable)

the mutation field whose statement this row refuses; with the type, the coordinate graphitron_mutation_write_payload is keyed by

cause (CHARACTER VARYING, nullable)

which gate refused, in a closed vocabulary of four: MIXED_CARRIER_KEY_MEMBERSHIP and NULLABLE_STRADDLING_REFERENCE from the partition stage, then PLAIN_COLUMN_COLLISION, then NO_SET_FIELDS. Only the causes of the first stage with any appear for a coordinate. A new refusal in the UPDATE walker is a new value here rather than a silence

path (CHARACTER VARYING, nullable)

the occurrence path the refusal is located at; NULL exactly on NO_SET_FIELDS, which is about the statement and has no occurrence to point at

container_type_name (CHARACTER VARYING, nullable)

the input object type the located field is declared on; NULL together with the path

input_field_name (CHARACTER VARYING, nullable)

the located field’s name within that container; NULL together with the path

column_name (CHARACTER VARYING, nullable)

the column two plain carriers both assign; NULL on every cause but PLAIN_COLUMN_COLLISION, a straddle being a fact about a carrier rather than about one of its columns

write_source_name (CHARACTER VARYING, nullable)

the catalog partition of the table the write targets

write_schema (CHARACTER VARYING, nullable)

the write table’s SQL schema

write_table (CHARACTER VARYING, nullable)

the write table’s SQL name; with the two columns above, sql_table’s full key

source_name (CHARACTER VARYING, nullable)

the declaration file a diagnostic would point at, which is the located field’s own on the three located causes and the @mutation application’s on NO_SET_FIELDS

source_line (INTEGER, nullable)

source line of that declaration, 1-based

source_column (INTEGER, nullable)

source column of that declaration, 1-based

intent_node_container_member (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. What a polymorphic container holds, read as the node-id family asks it: one row per member of every container, carrying whether that member binds a table and whether it is a node type. Keyed on the container, because which node types are members of an interface is a fact about the interface and not about any slot that names it; keying it on a use site would store one copy of the answer per consuming coordinate. Total rather than filtered to the admissible members, and that is the whole of why it is a relation rather than a predicate inside its readers: three readers want three populations off it. The resolution axis above it, intent_node_id_candidate_node_type, wants the members that are both; intent_node_id_polymorphic_decode_defect’s MEMBER_NOT_NODE_TYPE wants the table-bound members that are not node types and so could not read a filtered relation at all; and the editor’s node-type keyset wants the containers with at least one of each. The two predicates are columns rather than a name that bakes one caller’s filter in, on intent_bound_table.candidates' own terms: whether either holds decides the reading, so it is stated as a column rather than left to each reader’s own existence test. This is the graphitron_spelled_table / intent_bound_table layering at the container grain, over intent_poly_member rather than over the captured relation beneath it, which is where a derivation over membership stands. The read side’s per-participant candidate derivation can re-source onto this relation the day someone wants the two to agree by construction rather than by both being right.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from intent_poly_member; the leading key dimension that keeps one workspace’s graphs apart

container_name (CHARACTER VARYING, nullable)

the polymorphic type holding the member: the union on one arm of the membership beneath, the interface on the other. The key’s second dimension, and the name a @nodeId(typeName:) writes when it names a container

container_kind (CHARACTER VARYING, nullable)

UNION or INTERFACE, carried from intent_poly_member.container_kind. Provenance, and carried rather than dropped because a refusal about a container names what sort of type it is when it offers the author a remedy

member_type_name (CHARACTER VARYING, nullable)

the object type the container resolves to; completing the key. Source order is deliberately not carried: a reader that needs the members in order reads intent_poly_member.position, and this relation’s readers ask about the set rather than about the sequence

is_table_bound (BOOLEAN, nullable)

whether the member binds a table, read off graphitron_tabletype at the member’s own name. What separates a member a polymorphic node id could decode into from one it could not: a member with no table has no record and no key. TRUE alone is not admissibility, the column beside it being the other half

is_node_type (BOOLEAN, nullable)

whether the member is a node type, read off graphitron_node_type at the member’s own name. With the column beside it, admissibility: a polymorphic decode needs every table-bound member to be a node type of its own, because a candidate set with a hole in it would reject one member’s ids at runtime with nothing in the build saying so. A member that is a node type and binds no table is not a contradiction to be resolved here; nodehood is a declaration-level answer, on graphitron_node_type’s own terms, and this relation reports both readings rather than reconciling them

intent_node_id_candidate_node_type (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. The node types an id arriving at a @nodeId instruction may belong to: one identity row for a resolved type that is a node type, one row per admissible member for one that is a polymorphic container. The resolution axis of the node-id family, keyed on the resolved type rather than on a use site, so a container’s member set is stored once however many coordinates name it. What it buys is that the polymorphic destination is a branch inside the decode relation’s existing slot arm rather than a second arm over the same driving relation: that arm joins this on the slot’s resolved type and the key shape on the node type this yields, so a node-typed instruction yields the one row it always yielded and a container yields one row per member with that member’s own key. Two readers ask it on day one, that destination and the sibling polymorphic defect view, which is the threshold this schema sets for a derivation to get a name of its own. The two arms are disjoint by construction and not by precedence, which is what lets this be a plain union: the identity arm is every node type, and the member arm excludes a container that is itself one, the same predicate graphitron_node_id_instruction_rule’s container arm carries. The identity arm is total over the node population rather than restricted to types some instruction names, because keying on the resolved type means the relation answers a question about a type and a population trimmed to today’s readers would be a filter one of them made for itself.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from whichever arm produced the row; the leading key dimension

resolved_type_name (CHARACTER VARYING, nullable)

the type an instruction’s basis resolved, as graphitron_node_id_instruction.resolved_type_name spells it: the node type itself on the identity arm, the container on the member arm. The join key a reader holding a slot row already has

node_type_name (CHARACTER VARYING, nullable)

one node type an id at such an instruction may belong to, and always a node type whatever the arm: equal to the resolved type on the identity arm, an admissible member of it on the member arm. The name intent_resolved_node_key_shape and graphitron_node answer for, which is what makes this the axis the decode joins the key shape through

intent_node_id_decode (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. How one decoding @nodeId instruction is carried out: one row per instruction, use site, branch and, where the instruction named a polymorphic container, member, naming the destination that receives the decoded tuple. The branch is the table the decode departs from, and it is part of the key rather than a column carried along: a slot whose consuming field returns a multi-table polymorphic container is rooted in one table per branch, the endpoint relation states one pair per branch, and each branch is a predicate the generator emits, so each gets its own destination and its own arity here. On the slot arm the three origin columns are NULL, determined by destination in the sense the nullable-by-kind discipline allows: a slot is reached at the root of the use site and departs no table at all. An instruction with no row here was not carried out, and absence is therefore never a message but the membership condition a defect view is keyed on, which is what keeps a resolution and a rejection from restating one fact. Presence is not an emitter, on intent_node_id_encode’s wording for its own half and for the same reason: a row says where the decoded tuple would land, and whether the generator carries the decode out at that coordinate is the schema walk’s fact rather than this relation’s. A cross-table filter naming a node type no foreign key connects the field’s table to draws a TARGET_TABLE_COLUMNS row here and is refused outright by the walk, which is the measurement that settles the reading. So a rule about whether a decode was installed reads what the run installed and not this relation; the build-path rule that does, over the instruction census and the classification run’s own dispositions, is deliberately no reader of this one. The reduction this relation performs is the whole of the junction-table case. A decode whose every key position lifted to a column of the row’s own table binds locally on a tuple of that table; one where any position did not binds the node type’s own key columns on the node type’s own table inside a correlated EXISTS; and a chain through a junction table is the second because its lift contributes no local column, not because anything rejects it. Those were one conjunct in the resolution this replaces, which picked the local shape when the terminal key’s referenced columns were the node key as a multiset, so the remote shape was unreachable for a multi-hop path and a chain that translated a column met a rejection before the question was asked. Here they are a count against a count. Anything short of every position is remote, which is always correct where a tuple predicate is not, and which position failed to arrive is the key-column child’s answer rather than this relation’s. All five destinations, in two arms over populations that are disjoint by construction rather than by a filter either arm applies twice. The fifth is a branch inside the slot arm and not a third arm: that arm joins intent_node_id_candidate_node_type on the slot’s resolved type and the key shape on the node type it yields, so a node-typed instruction yields the one row it always yielded and a container yields one row per member with that member’s own arity, and the destination CASE forks on resolved_type_kind rather than on a re-derived predicate. WHERE s.candidates = 1 survives verbatim, the multiplicity having moved off the slot relation’s partition and onto the resolution axis. A third arm would drive off intent_node_id_decode_slot a second time and re-join the key shape, which is what the derivation-depth rule forbids in the relation this comment calls the deepest derived read in the schema. The polymorphic branch is admitted by a NOT EXISTS over the members rather than by a per-member predicate, because one member whose record the slot’s type is not refuses the whole slot; and it is therefore silent at an input-field site, where the slot relation types the bean rather than the annotated member and no member’s record is that type. That silence is the polymorphic defect view’s stated edge and not a hole here. A decode landing in a Java slot is the slot arm’s, on intent_node_id_decode_slot’s answer, and the table arm excludes exactly that population, because a slot receives the value and the departing table then binds nothing. The arms are not a per-destination decomposition of one query, which the derivation-depth rule forbids: they read different driving relations for different facts, the table arm reducing the key-column child’s lift and the slot arm reading a parameter and the node key’s shape, and neither re-joins the other’s operands. Within the slot arm the record destination is tested first and wins, which is a precedence and is stated as one: a record holds a tuple whatever the key’s arity, so a single-column key reaching the node type’s own record is that record’s row and not a bare column value. The record has to be the node type’s own table’s record, and a slot typed as some other table’s generated record is deliberately no row here rather than falling through to the single-column destination: a record standing for the enclosing input type receives the tuple on its own table’s columns rather than on the argument’s scope table, so its lift departs somewhere this relation’s endpoints do not resolve, and reading it as a single-column slot would bind one value into a row type. The single-column destination requires arity one and then stands aside on either type being unknown, on intent_resolved_node_key_projection’s discipline for the same operands: a parameter no census could type and a key column no catalog could type both resolve here and are carried out on arity alone, with javac as the backstop, because refusing on an operand nobody could read is the silence this family exists to close. A slot whose type is known and disagrees is no row, and so is a composite key at a slot that is not a record; both are the defect view’s to name. An overloaded producer is also no row, this arm requiring one candidate rather than picking a type, which the slot relation’s own comment asks of a reader that needs the type; that leaves such an instruction in neither population, which is a gap in the partition and named as one rather than absorbed here. Population boundary, stated because a hole here reads as a fact everywhere downstream, and the two arms have different ones. The table arm’s rows come from the endpoint population, so an instruction whose departing or arriving table did not resolve unambiguously has no row and is a defect rather than a decode. The slot arm needs no departing table at all, a slot being reached at the root of the use site, and needs the node type’s key to have resolved, which is the one binding it does read. The node type’s key arity is carried rather than counted by each reader, both because a message about a single-valued slot names the count and because it is the operand the single-column destination turns on. Expensive, and the cost is invisible at the call site, which is why it is stated here: this is the deepest derived read in the schema, it reaches most of the tables the @nodeId and input-field stages write, and one read of it against a real capture has been measured in seconds rather than milliseconds. A reader that wants it takes it once and pairs it on its key, never correlated per row, per the rule under "Derived reads are views, not stored facts". It is not stored because nothing on the build path reads it yet; the sibling that is read there is intent_node_id_decode_defect, over intent_node_id_decode_slot rather than over this relation.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from the instruction

site (CHARACTER VARYING, nullable)

ARGUMENT or INPUT_FIELD, as on the instruction; the OUTPUT_FIELD site encodes and is answered by intent_node_id_encode instead

type_name (CHARACTER VARYING, nullable)

the type owning the slot, as on the instruction

field_name (CHARACTER VARYING, nullable)

the slot’s field name, or on ARGUMENT the field the argument sits on

argument_name (CHARACTER VARYING, nullable)

the argument carrying the instruction on ARGUMENT; NULL on INPUT_FIELD, determined by site as on the instruction

path (CHARACTER VARYING, nullable)

the occurrence path this row’s use site is, on INPUT_FIELD; NULL on ARGUMENT. Carried for a reader that wants the descent as rows, never as a join key

use_site (CHARACTER VARYING, nullable)

the consuming coordinate serialized, carried from the instruction; with the graph and the branch below, this relation’s key, and the key its two children carry

node_type_name (CHARACTER VARYING, nullable)

the node type whose key the decode yields, which on the polymorphic destination is the member rather than the type the instruction named: this stays node_type_name and stays a node type at every destination, while the two authored rungs beneath it carry resolved_type_name and the kind beside it. Two facts with two names and a keying between them, on the graphitron_spelled_table / intent_bound_table layering’s terms rather than one name meaning two things at two rungs; graphitron_node_keycolumn on this name and the graph is the other end of the opaque format, and graphitron_node_id_decode_column is that key already paired with where each position lands

origin_source_name (CHARACTER VARYING, nullable)

the catalog partition of the table this decode departs from, carried from the key-column child on the table arm; NULL on the slot arm, which departs no table. With the two columns below it this is the branch, and with the graph and the use site it is the key

origin_schema (CHARACTER VARYING, nullable)

the departing table’s SQL schema on the table arm; NULL on the slot arm

origin_table (CHARACTER VARYING, nullable)

the departing table’s SQL name on the table arm; NULL on the slot arm. The table a local tuple predicate binds on, which is what makes the destination beside it a statement about this branch rather than about the coordinate

destination (CHARACTER VARYING, nullable)

what receives the decoded tuple, in a closed vocabulary of four. OWN_TABLE_COLUMNS: every key position lifted to a column of the row’s own table, so the predicate binds locally on a tuple of it with no join. TARGET_TABLE_COLUMNS: at least one position did not, so the predicate binds the node type’s own key columns on its own table inside a correlated EXISTS, which is the shape a junction chain takes and the shape a non-unique path wants. JOOQ_RECORD: the value descends into a Java slot typed as the generated record of the node type’s own table, which holds the whole tuple. SINGLE_KEY_COLUMN: the value descends into a Java slot that is not such a record and the key is one column, so that column’s value goes in it. The first two are the table arm and the last two the slot arm, and no row here carries the fifth reading a consumer might want, which is that the decode does not happen: absence is that, and the defect view keyed on it says which precondition stopped it

arity (INTEGER, nullable)

how many key columns the node type resolved, counted over graphitron_node_id_decode_column within this row’s own branch on the table arm and read off intent_resolved_node_key_shape on the slot arm; one number reached two ways because the table arm already has one row per key position and counting them costs nothing, where the slot arm has no such child to count. Carried rather than counted per reader for two reasons that are one fact: a refusal at a single-valued slot names this number, and it is the number that decides whether such a slot can carry the instruction at all

intent_node_id_decode_defect (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. What is wrong with a decoding @nodeId instruction whose value reaches a Java parameter and which the decode declined to route there: one row per refused instruction and use site, in a closed verdict vocabulary of two, over the slot relation and the node key’s shape alone. The rejections that close the last silence this directive had, where an author annotated an argument @nodeId, the walk’s type gate stood aside because a decoded value and the ID’s coercion output never meet, and the wire string then reached the consumer’s parameter with nothing in the build saying a word. Written in one pass with the verdict picked by a CASE rather than one UNION ALL arm per verdict, for the reason the fact model states about inline multiplicity: the two verdicts read the same two driving relations for the same two facts, so an arm each would name both a second time to say something one predicate already decides. Population, and it is the whole design rather than a scoping convenience: these are the slot rows the pair-grain argMapping family cannot see, and intent_node_id_decode_slot.carrier already names them. A MAPPED_PARAMETER slot at an argument site is an argMapping pair whose bound leaf is that @nodeId argument itself, so intent_argmapping_projection_defect judges both of these facts there already, BARE_NODE_ID for the arity and KEY_COLUMN_TYPE_MISMATCH for the type disagreement, each keyed on the entry the author wrote and each with a remedy naming it. Restating them here would be a second copy of a shipped rejection with a precedence between the two, which is how one family ends up with two answers that agree until one changes. NAMED_PARAMETER is the carrier no pair exists for, which the slot relation calls the coordinate at which the wire format reached consumer code unread, and judging it is the whole of what this relation adds. The input-field site draws no row, and that is the population’s stated edge rather than an omission. There the parameter receives a container and the decoded value goes to a member of it, so the one destination that resolves is the node type’s own record and everything else wants the walk into the class the slot relation deliberately does not perform. Comparing a container’s type against a key column’s is not an author error and a refusal naming both would be asking for a parameter the author was right to declare, so the shape is owed an emitter rather than a verdict. Which verdict fires is the key’s arity and nothing else, which is why one CASE decides it. Above one column there is nowhere for the second value to go, a parameter holding one; at one column the two types are compared. Both are the author’s to fix in one line of their own signature, so neither is a deferral and no arm here fails while promising an emitter later. The type verdict fires only where both operands are known, which is intent_resolved_node_key_projection’s discipline for the same comparison and is load-bearing rather than inherited wording: a key column no catalog could type and a parameter no census could type both leave the decode to be carried out on arity alone with javac as the backstop, because refusing on an operand nobody could read is the silence this family exists to close and not a second one to open. The arity verdict reads the slot’s type too, and reads it as an absence rather than as a value: what it needs is whether the slot is the tuple’s own row type, and a parameter position naming no class is a primitive or a type variable, neither of which is a generated record, so a composite key still refuses at a parameter the census could not type. That is not a verdict fabricated from a missing fact; the operand is the row type’s identity and the absence answers it. There is no accept line and no population filter of its own, on intent_authored_claim_conflict’s settled terms: the build-error surface joins the classification domain, only an emitted coordinate being able to fail a build, and the editor’s diagnostic arm reads the rows ungated, a coordinate nothing reaches being where an author most needs the signal. Absence is therefore not a message here either. An instruction with a row in neither this relation nor its direction’s resolution relation is either a shape the model does not yet account for or a coordinate another family refuses, and both lists are enumerated rather than left to be discovered. Owed an emitter: every input-field slot above, and a slot the value lands inside. Refused elsewhere: an overloaded producer, whose several candidate slots are a reference the schema walk rejects by name before any of this is read, so declining to pick here leaves no silence; and a departing or arriving table that did not resolve, which the walk likewise refuses on its own. There is no message column, the closed vocabulary plus the witness columns being the fact base and the prose belonging with the consumer that composes it.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from the slot relation

site (CHARACTER VARYING, nullable)

the instruction’s site, carried from the slot relation; ARGUMENT throughout today, the input-field site being outside this relation’s population for the reason the view comment states. Carried rather than dropped as a constant because the shape that admits it is owed an emitter rather than excluded on principle, and a row shape that already has the column will not change when it lands

type_name (CHARACTER VARYING, nullable)

the type owning the field the refused argument sits on, as on the instruction

field_name (CHARACTER VARYING, nullable)

the field the refused argument sits on; with the type above, the coordinate a located error attaches to

argument_name (CHARACTER VARYING, nullable)

the argument carrying the instruction, always present on this relation’s one site

path (CHARACTER VARYING, nullable)

the occurrence path the use site is on the input-field site; NULL throughout today, that site drawing no row here

use_site (CHARACTER VARYING, nullable)

the consuming coordinate serialized, carried from the instruction; with the graph, this relation’s key, and what a consumer joins on to reach the instruction or the slot

node_type_name (CHARACTER VARYING, nullable)

the node type the instruction named, whose key the slot cannot take; the name a refusal quotes, and the join key to graphitron_node_keycolumn for the columns themselves

verdict (CHARACTER VARYING, nullable)

which precondition stopped the decode, in a closed vocabulary of two. KEY_ARITY_EXCEEDS_SLOT: the node type’s key is several columns and the parameter holds one value, so the refusal names the type and the count. KEY_COLUMN_TYPE_DISAGREEMENT: the key is one column and the Java type it binds as is not the parameter’s, so the refusal names both types and the column. Decided by the arity alone, which is why the two are one pass over one population rather than two arms

arity (INTEGER, nullable)

how many columns the node type’s key has, read off intent_resolved_node_key_shape rather than counted here. The operand the verdict is chosen by, and the number the arity refusal quotes

key_column_name (CHARACTER VARYING, nullable)

at arity one, the column whose value the parameter would have received, as the winning tier spells it; NULL above one by the key’s shape, where there is no single column to name and the arity is what the message is about

column_java_type (CHARACTER VARYING, nullable)

at arity one, the fully qualified Java type jOOQ binds that column as: the left operand of the disagreement, and never NULL on a type-verdict row, the verdict requiring it. NULL on an arity-verdict row, where the key has no single column

slot_java_type (CHARACTER VARYING, nullable)

the fully qualified Java type the parameter takes, at the root of its declared type, carried from the slot relation. The right operand of the disagreement and never NULL on a type-verdict row. NULL is possible on an arity-verdict row and means the census read no class at that position, a primitive or a type variable, which is not the node type’s generated record and is why such a row still refuses

param_name (CHARACTER VARYING, nullable)

the parameter’s own name in Java, which on this relation’s one carrier is the argument’s own name, that name match being how the slot was found. What a message names so an author can find the signature to change

root_type_name (CHARACTER VARYING, nullable)

the type owning the field whose producer method declares the parameter, carried from the slot relation; equal to type_name on this relation’s one site, and carried all the same so a message reads the same way when the input-field site joins the population

root_field_name (CHARACTER VARYING, nullable)

the field whose producer method declares the parameter, on the same terms as the type beside it

root_argument_name (CHARACTER VARYING, nullable)

the argument the descent starts at, equal to argument_name on this relation’s one site

source_name (CHARACTER VARYING, nullable)

the SDL file the instruction was captured from, carried through the slot relation so a located error needs no join to the population

source_line (INTEGER, nullable)

source line, 1-based per the graphql-java convention

source_column (INTEGER, nullable)

source column, 1-based per the graphql-java convention

intent_node_id_decode_endpoint (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. Where a decode starts and where it has to arrive: for every slot carrying the @nodeId instruction on a decoding site, the table the slot’s own predicate binds on and the table the named node type’s keys live on. The relation the decode’s hop child, its key-column child and the destination over them all read, and it exists because those three would otherwise each resolve the same two tables: the destination is a reduction over the key-column child, the key-column child walks the hops, and the hops need a departure, so the endpoints have to be stated once below all three rather than recomputed inside each. Decoding sites only, which is the direction rule stated as a population rather than as a column: an output field encodes and the two input-side sites decode, so this relation’s WHERE clause is where the direction lives and no reader switches on one. The departure is graphitron_argument_scope_table’s answer at the consuming argument, which for an argument is its own coordinate and for an input field is the coordinate at the head of its occurrence path, both reached in one pass over the population; that answer is one table per branch where the consuming field returns a multi-table polymorphic container, so such a slot has one endpoint pair per branch and the decode is stated once per branch, which is what the resolver does with it; the two would be a union arm each and each would name the instruction relation again, which is the multiplicity the fact model’s own measurements warn about, so the occurrence path joins outer and the coordinate is picked by COALESCE. The arrival is the node type’s resolved binding, demanded unambiguous for the reason the departure is: two candidate tables are two different key tuples, and a decode against a table the author never named is worse than a decode that does not resolve. The navigation column is the whole reading this relation adds beyond the two tables, and it is a closed vocabulary of three. SAME_TABLE is own-row identity: the slot supplies encoded ids of the very rows it binds on, so the keys land on the row’s own key columns and there is nothing to walk. AUTHORED_PATH is an @reference the author wrote, whose hops the reference-target views resolve, one such view per site. DISCOVERED_KEY is neither written nor identity, where the resolution is the one foreign key declared on the departing table that reaches the arriving one. A fourth value stood here and no longer does. UNRESOLVED_PATH named an input field carrying its own @reference, whose path departs an input type that binds no table, and it existed because no relation walked such a path: the two reference-target views of the time departed from a field’s own binding and from an argument’s scope, and an input field has neither. The value was a statement that the question could not be asked, kept as a value rather than an absence so a consumer could not read it as a chain that legitimately lifted nothing. The input-field walk now exists, departing from the table the consuming field hands the expansion, so the same path resolves the same way an argument’s does and the shape is an AUTHORED_PATH like any other. What the retired value protected against is worth keeping in view, because the protection is now structural rather than nominal: an empty hop set still means own-row identity under one navigation and a chain that stopped under another, and the hop relation states which.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from the instruction

site (CHARACTER VARYING, nullable)

ARGUMENT or INPUT_FIELD, as on the instruction; the OUTPUT_FIELD site is absent by construction, an output field encoding rather than decoding

type_name (CHARACTER VARYING, nullable)

the type owning the slot, as on the instruction

field_name (CHARACTER VARYING, nullable)

the slot’s field name, or on ARGUMENT the field the argument sits on

argument_name (CHARACTER VARYING, nullable)

the argument carrying the instruction on ARGUMENT; NULL on INPUT_FIELD, determined by site as on the instruction

path (CHARACTER VARYING, nullable)

the occurrence path this row’s use site is, on INPUT_FIELD; NULL on ARGUMENT. With the four columns above this is the coordinate, and it is the key only where the coordinate resolves one departing table: a slot whose consuming field returns a multi-table polymorphic container has one row here per branch, differing in the three departure columns and agreeing in every other, so the key is the coordinate and the departure together. The children carry that whole key, the departure travelling down them as their origin columns

use_site (CHARACTER VARYING, nullable)

the consuming coordinate serialized, carried from the instruction so a message needs no second join

node_type_name (CHARACTER VARYING, nullable)

the node type the instruction named, whose key columns the decode yields; graphitron_node_keycolumn on this name and the graph is the other end of the opaque format

navigation (CHARACTER VARYING, nullable)

how the decode reaches the arriving table, in a closed vocabulary of three: SAME_TABLE for own-row identity with nothing to walk, AUTHORED_PATH for an @reference the author wrote, DISCOVERED_KEY for the one foreign key declared on the departing table that reaches the arriving one. The column the hop child’s arms are disjoint on. A fourth value, UNRESOLVED_PATH, named an input field’s own @reference back when no relation walked one, and it is retired rather than merely unused: the input-field reference walk exists, so such a path is an AUTHORED_PATH and a reader switching on the retired value would be switching on a population that is now empty. One route the three values do not account for: a per-participant @referenceFor path is stated here as SAME_TABLE or DISCOVERED_KEY, no view reading the two @referenceFor step tables, so such a slot’s navigation is auto-discovery’s while the classifier walks the chain the author wrote. intent_node_id_decode_landing_defect declines a branch intent_reference_for_application reaches for that reason, and closing the gap is a re-keying of this family onto the participant axis rather than a fourth value here

from_source_name (CHARACTER VARYING, nullable)

the departing table’s catalog partition: the table the slot’s predicate binds on, which is the argument’s scope table at its own site or at the head of its occurrence path. With the two columns below it, the branch, and part of this relation’s key rather than an answer the coordinate already fixed; the three children carry it as their origin columns for that reason

from_schema (CHARACTER VARYING, nullable)

the departing table’s SQL schema

from_table (CHARACTER VARYING, nullable)

the departing table’s SQL name; the branch, where the coordinate has several

to_source_name (CHARACTER VARYING, nullable)

the arriving table’s catalog partition: the node type’s own resolved binding, the table its key columns sit on

to_schema (CHARACTER VARYING, nullable)

the arriving table’s SQL schema

to_table (CHARACTER VARYING, nullable)

the arriving table’s SQL name; equal to the departing one exactly on the SAME_TABLE navigation, which is how that value is decided rather than a coincidence a reader has to check

intent_node_id_decode_landing_defect (view)

One @nodeId decode whose key landing the store can show is wrong: one row per refused instruction, use site and branch, in a closed verdict vocabulary of two. For example a path stopping on film_category where the node type is bound to category draws PATH_STOPS_SHORT naming both tables, and a key column jOOQ binds as String landing on one it binds as Long draws LANDING_TYPE_DISAGREEMENT naming both.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from the endpoint relation

site (CHARACTER VARYING, nullable)

ARGUMENT or INPUT_FIELD, as on the endpoint relation; both sites draw rows here, which is what makes the coordinate lead of a message this relation’s consumer mints rather than copies

type_name (CHARACTER VARYING, nullable)

the type owning the slot, as on the endpoint relation

field_name (CHARACTER VARYING, nullable)

the slot’s field name, or on ARGUMENT the field the argument sits on; with the type above, the coordinate a located error attaches to

argument_name (CHARACTER VARYING, nullable)

the argument carrying the instruction on ARGUMENT; NULL on INPUT_FIELD, as on the endpoint relation

path (CHARACTER VARYING, nullable)

the occurrence path the use site is on INPUT_FIELD; NULL on ARGUMENT, as on the endpoint relation

use_site (CHARACTER VARYING, nullable)

the consuming coordinate serialized, carried from the endpoint relation; with the graph, the branch below and the verdict, this relation’s key

node_type_name (CHARACTER VARYING, nullable)

the node type the instruction named, whose key the landing was computed for; the name a refusal quotes

root_type_name (CHARACTER VARYING, nullable)

the type owning the field that consumes this use site: the occurrence path’s root field’s type on INPUT_FIELD, equal to type_name on ARGUMENT where an argument’s consumer is the field it sits on. Carried rather than left to a join because it is both the coordinate a located error attaches to and the type the build-error consumer’s classification-domain gate reads, which is intent_node_id_decode_defect’s reason for carrying its own root columns

root_field_name (CHARACTER VARYING, nullable)

the consuming field’s name, on the same terms as the type beside it

branches (INTEGER, nullable)

how many endpoint rows the coordinate and node type hold, so a consumer knows whether naming the branch below tells an author anything. Counted over the endpoint population rather than over the judged one: a coordinate with two branches where only one is judged still has two, and a message that named no branch there would leave the author to guess which of their participants it is about

origin_source_name (CHARACTER VARYING, nullable)

the catalog partition of the table the decode departs from, carried from the endpoint relation. With the two columns below it this is the branch: a slot under a multi-table polymorphic root decodes once per branch, and a branch can mislead where its sibling does not, so a row here is one branch’s verdict rather than the coordinate’s

origin_schema (CHARACTER VARYING, nullable)

the departing table’s SQL schema, carried from the endpoint relation

origin_table (CHARACTER VARYING, nullable)

the departing table’s SQL name, carried from the endpoint relation; on the type verdict, the table local_column_name below names a column of

verdict (CHARACTER VARYING, nullable)

what the store can show is wrong with the landing, in a closed vocabulary of two. PATH_STOPS_SHORT: the authored path’s last hop arrives on a table other than the one the node type is bound to, so a decoded id of that type binds against columns the path never reached. LANDING_TYPE_DISAGREEMENT: every position of the key landed on a column of the departing table and one of those pairs disagrees on the Java type jOOQ binds them as, so no predicate can compare one against the other. The totality is the verdict’s subject rather than a strictness setting: the arm choice is per endpoint and total, any position landing nowhere binding the node type’s own key columns remotely inside a correlated EXISTS, and such an endpoint has no local operand for a landed position’s type to disagree with, so a row there would refuse a schema over a comparison nothing emits. Two UNION ALL arms rather than one pass with a CASE, unlike intent_node_id_decode_defect: the arms drive off different children of the endpoint relation, the hop relation and the key-column relation, and share only the endpoint, so one pass would join both children on every row to decide which applies. Absence is not an accept line and is never a message: a decode with no row here either lands its key on the columns its path says it does, or departs a branch this relation’s population declines, or sits at a coordinate another family refuses first, and which of the three is a reading of the endpoint relation’s navigation rather than of this relation’s silence

terminal_source_name (CHARACTER VARYING, nullable)

on PATH_STOPS_SHORT, the catalog partition of the table the path’s last hop arrives on; NULL on the type verdict, which is about a landing that did reach the node type’s table

terminal_schema (CHARACTER VARYING, nullable)

the terminal hop’s arriving schema on PATH_STOPS_SHORT; NULL on the type verdict

terminal_table (CHARACTER VARYING, nullable)

the terminal hop’s arriving table on PATH_STOPS_SHORT; NULL on the type verdict. The left witness of that verdict, the right one being the target table beside it, and a message naming only one of the two cannot say what is wrong

target_source_name (CHARACTER VARYING, nullable)

the catalog partition of the table the node type is bound to, carried from the endpoint relation’s arrival. Present on both verdicts: it is where a decode has to land, and on the type verdict it is the table key_column_name below names a column of

target_schema (CHARACTER VARYING, nullable)

the node type’s table’s SQL schema

target_table (CHARACTER VARYING, nullable)

the node type’s table’s SQL name

position (INTEGER, nullable)

on LANDING_TYPE_DISAGREEMENT, the 0-based position within the node type’s key whose landing disagrees; NULL on PATH_STOPS_SHORT, where no position is at fault and the path is. Recording the position is what lets a message about a nine-column key say which of the nine was the one that could not bind

key_column_name (CHARACTER VARYING, nullable)

on LANDING_TYPE_DISAGREEMENT, the node type’s key column at that position, as the winning key tier spells it; NULL on PATH_STOPS_SHORT

key_binding_type (CHARACTER VARYING, nullable)

on LANDING_TYPE_DISAGREEMENT, the fully qualified Java type jOOQ binds the key column to, from sql_column.binding_type: the left operand of the disagreement, and a converter’s user type exactly as the generated model reports it. NULL on PATH_STOPS_SHORT

local_column_name (CHARACTER VARYING, nullable)

on LANDING_TYPE_DISAGREEMENT, the column of the departing table the position landed on, spelled as the catalog spells it; NULL on PATH_STOPS_SHORT. Matched to the key column above by name with the case folded, which is the same comparison the lift itself makes, so the two columns this verdict compares are the two the generated predicate would have

local_binding_type (CHARACTER VARYING, nullable)

on LANDING_TYPE_DISAGREEMENT, the fully qualified Java type jOOQ binds the local column to: the right operand of the disagreement. NULL on PATH_STOPS_SHORT

source_name (CHARACTER VARYING, nullable)

the SDL file the instruction was captured from, carried through the instruction relation so a located error needs no join to the population

source_line (INTEGER, nullable)

source line, 1-based per the graphql-java convention

source_column (INTEGER, nullable)

source column, 1-based per the graphql-java convention

intent_node_id_decode_slot (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. The Java parameter a decoding @nodeId instruction’s value descends into, where it descends into one at all, and the type that parameter takes. The relation the decode’s destination forks on first, and the fork is not between two shapes of predicate but between a predicate and consumer code: a slot carrying the instruction never delivers the wire format to a consumer, so where the value reaches Java the departing table the endpoint relation resolved receives nothing and no predicate is emitted from it. What decides that is the root of the use site rather than the instruction’s own coordinate, which is the whole reason this relation is cheap and the reason it is correct. An argument’s value reaches Java when a producer parameter is fed from it; an input field’s value reaches Java exactly when the argument its occurrence path descends from does, the field being one step inside a value handed to that parameter. So both sites ask one question at one coordinate, the occurrence path supplies that coordinate for the input-field site and the instruction is its own for the argument site, and no relation about classes, type backings or class members is read at all. An earlier shape asked instead which class member received the value, and it was both slower by an order of magnitude and answering a question one step past the fork. Two carriers, disjoint by construction. MAPPED_PARAMETER is an argMapping pair whose path binds the root argument itself, which is how a bean or a record is fed the whole argument, and it covers both the pair that stops at the argument and the pair that names a key column beyond it, those being one destination differing only in provenance. NAMED_PARAMETER is the producer method declaring a parameter of the root argument’s own name with no pair on that parameter, which is the match the generator itself makes and the coordinate at which the wire format reached consumer code unread. The absence of a pair on the parameter is what makes the two disjoint, and it is read on the parameter rather than on the argument because a pair redirects a parameter to some other argument and the name match must not then claim it. Presence and type are two facts here and keeping them apart is the one place this relation must not inherit its neighbour’s reading. intent_argmapping_bound_parameter_type has no row where the census cannot type a parameter, and its readers are free to treat that absence as no answer. Here absence means something else: no row is "this decode binds a predicate", so an untypeable parameter arriving as absence would route a value bound for Java to a table predicate that has nothing to bind. Both arms therefore reach the type by outer join and an untypeable parameter is a row with a null type, which is what lets a consumer carry the decode out on arity alone and ask for a type only when it is about to refuse. Ambiguity is rows and nothing is preferred: an overloaded method or a class two classpath entries declare resolves more than one row and candidates says so, on the neighbouring relation’s own terms. Which is why an ambiguous producer reference is not filtered out here, where every other reader of that relation demands one candidate. Demanding one would drop the rows entirely, and a use site with no row here reads as binding a table predicate, so an author whose @service names two overloads would get the wire format bound into SQL on the strength of an ambiguity nobody resolved. Keeping the rows makes that use site a decode with several candidate slots, which a consumer refuses to carry out rather than mistaking for a predicate. The stated limit is one shape, and it is the one this relation’s coordinate choice trades away. An argMapping path that descends into the argument and binds one input field below it (a pair spelled arg.field) hands that one field to a parameter while its siblings still bind predicates, and this relation sees no row for either, its arms asking about the root argument and that path binding something under it. Saying which occurrence path such a pair names is a reconciliation between two decompositions of one descent rather than a join, and until that is stated an input field reached only that way is read as binding a predicate.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from the instruction

site (CHARACTER VARYING, nullable)

ARGUMENT or INPUT_FIELD, as on the instruction; the OUTPUT_FIELD site is absent by construction, an output field encoding rather than decoding

type_name (CHARACTER VARYING, nullable)

the type owning the slot carrying the instruction, as on the instruction: the argument’s owning type on ARGUMENT, the input object type on INPUT_FIELD. Not the root coordinate, which is the three columns below

field_name (CHARACTER VARYING, nullable)

the instruction’s field name, or on ARGUMENT the field the argument sits on

argument_name (CHARACTER VARYING, nullable)

the argument carrying the instruction on ARGUMENT; NULL on INPUT_FIELD, determined by site as on the instruction

path (CHARACTER VARYING, nullable)

the occurrence path this row’s use site is, on INPUT_FIELD; NULL on ARGUMENT. Carried for a reader that wants the descent as rows, never as a join key

use_site (CHARACTER VARYING, nullable)

the consuming coordinate serialized, carried from the instruction; with the graph, the key of the instruction this row is about, and what the decode relation joins on

resolved_type_name (CHARACTER VARYING, nullable)

the type the instruction’s basis resolved, carried whole from the instruction so a message about this parameter needs no second join. A node type or a polymorphic container, on that relation’s terms, and the kind beside it says which; a consumer that needs the node types themselves joins intent_node_id_candidate_node_type on this name, which answers for both kinds

resolved_type_kind (CHARACTER VARYING, nullable)

NODE_TYPE or POLY_CONTAINER, carried from the instruction. The column the decode relation’s record destination forks on, a container’s decode landing in whichever member’s record the wire id names rather than in one settled record class

root_type_name (CHARACTER VARYING, nullable)

the type owning the field the value’s descent starts at: the instruction’s own type on ARGUMENT, the occurrence path’s root type on INPUT_FIELD. The coordinate both arms resolve the parameter against, carried because it is the coordinate a message has to name when the parameter it found is several steps above the slot the author annotated

root_field_name (CHARACTER VARYING, nullable)

the field the descent starts at, on the same terms as the type beside it; the field whose producer method declares the parameter

root_argument_name (CHARACTER VARYING, nullable)

the argument the descent starts at: the instruction’s own argument on ARGUMENT, the occurrence path’s root argument on INPUT_FIELD. Equal to argument_name exactly on the ARGUMENT site, which is how that value is decided rather than a coincidence a reader has to check

carrier (CHARACTER VARYING, nullable)

which rule found the parameter, a closed vocabulary of two. MAPPED_PARAMETER: an argMapping pair binds the root argument, so the parameter it names receives the whole argument. NAMED_PARAMETER: no pair names that parameter and the producer method declares one of the root argument’s own name. Provenance and shape at once, as on the instruction’s basis column, because a refusal has to be able to say how the parameter was found: an author who wrote no argMapping is told about a name match and an author who wrote one is told about their own entry

param_name (CHARACTER VARYING, nullable)

the parameter’s own name in Java, which on both arms is the name the match was made on: the pair’s left side, or the declared parameter name the argument matched

java_type (CHARACTER VARYING, nullable)

the fully qualified binary name of the type the parameter takes, at the root of its declared type. NULL where no census could read it: a consumer compiled without -parameters, a reference resolving no method, a primitive parameter, or a position naming no class. The root and not the peel, deliberately, so that this is the same value intent_argmapping_bound_parameter_type states and a type agreement a projection already performs cannot answer differently depending on which arm found the parameter. A container-typed parameter therefore reports the container, and that a list of node ids is a coherent request rather than a mistake is stated on the leaf relation and is a consumer’s reading, not this relation’s

candidates (INTEGER, nullable)

how many rows this use site resolved, counted over both carriers. One is the ordinary answer; more than one is an overloaded method or a class two classpath entries declare, and this relation distinguishes neither. A reader requiring one type requires this to be one rather than picking, which is the discipline intent_argmapping_bound_parameter_type states for its own version of this column; a reader asking only whether the value reaches Java ignores it

source_name (CHARACTER VARYING, nullable)

the SDL file the instruction was captured from, carried from the instruction. Here for the reason resolved_type_name is: a refusal about this parameter is located at the slot the author annotated, and a consumer that had to re-join the instruction for its position would name the population relation a second time, which is the multiplicity the fact model measures as dominant

source_line (INTEGER, nullable)

source line, 1-based per the graphql-java convention, carried from the instruction

source_column (INTEGER, nullable)

source column, 1-based per the graphql-java convention, carried from the instruction

intent_node_id_encode (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. How an output field carrying the @nodeId instruction produces the tuple it encodes. The encoding half of the resolution, and a separate relation from the decode rather than one relation with a direction column, because the two answer different questions and sharing a row shape would leave half the columns nullable by kind: a decode has a destination that receives a tuple and, where that destination is a table, a column correspondence and possibly a join path, while an encode has a source that produces one and never has either. Direction is therefore not a column anywhere; it follows from the site and from which of the two relations answered. Output fields only, which is that rule stated as a population. Two sources, and the discriminator is whether a column tuple is in scope at all. PROJECTED_COLUMNS is everything that encodes today: the field sits on a type some table stands for and nothing overrides how its value is produced, so the key columns are selectable and the encode wraps them at the projection, whether they are the row’s own or reached through an authored path. READ_VALUE is the rest, and it is one source rather than four because the four spellings differ only in the mechanism a value arrives by: an accessor on a backing class, a by-name record read, a typed column off a record, or graphql-java’s own property machinery all hand the generator one value, and the encode applies to what the read yielded. The two conditions that put a field there are a containing type no table stands for, which is what an @error type is, and a field whose value a named producer method returns, which overrides the projection its containing type would otherwise offer. That second condition reads the producer reference and not the method it resolves to, on purpose: an @externalField naming a method the classpath census never saw still means the value is read rather than projected, and asking the resolved relation would have made an unresolvable reference look like a projection, which is the one reading that puts a base64 string where a column belongs. One precondition is stated here and it is arity: a read yields one value, so a node type whose key is several columns cannot be encoded from one, and such a coordinate has no row. The other precondition a READ_VALUE encode has is deliberately not stated here, and the reason is a limit rather than a preference: an encode from a read needs the value to arrive as the key column’s own Java type, and what type the read yields is decided by which of four locator arms the classification chose. Two of the four type nothing at all, and one of the two that do resolves an accessor by a candidate order and a naming rule, which is an algorithm and not a fact this schema holds. So these rows over-claim by exactly the coordinates the schema walk refuses on type, that refusal being where both operands are in hand: the walk loads the backing class through the codegen classloader and reads the catalog for the column. A reader wanting the whole truth about an output field reads the classification’s own verdict beside this relation, and a partial precondition here would be worse than the stated absence, since it would resolve or refuse depending on which arm answered without being able to say which arm that was. A projection has no such limit, the whole tuple being in scope, which is why the arity demand is written once against the source rather than as a blanket filter. Absence is therefore not the message and never should be read as one: an instruction with no row here was not carried out, and which precondition stopped it is the detection stratum’s statement with the operands to make it, on the same terms that keep the candidate and projection relations beside the argMapping family disjoint by construction rather than each re-testing the other’s predicate. Presence is not an emitter, which is the symmetric reading and the easier one to get wrong: a row says where the tuple would come from, and whether the generator carries the encode out at that coordinate is the schema walk’s fact rather than this relation’s. Two shapes here are recognised and deferred rather than emitted, and both are named so neither is left to be discovered: a PROJECTED_COLUMNS row over an authored path that did not collapse into the parent’s own columns, which the walk defers at the reference carrier, and a READ_VALUE row for a field whose value a producer returns, which the walk defers with a message naming the producer directive. Narrowing the population to what emits today would make this relation track emitter maturity, so a shape acquiring an emitter would change rows in a graph whose schema nobody touched, and the two facts a consumer wants apart would be one column again.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from the instruction

type_name (CHARACTER VARYING, nullable)

the object type owning the encoding field

field_name (CHARACTER VARYING, nullable)

the encoding field’s name within that type. With the two columns above this is the key: an output field is its own use site, so there is no third component and no path, which is the shape difference from the decode stated as a narrower key

use_site (CHARACTER VARYING, nullable)

the coordinate serialized, carried from the instruction so a message needs no second join; always Type.field here, an output field being its own use site

node_type_name (CHARACTER VARYING, nullable)

the node type whose identity is being encoded, written or inferred. graphitron_node_keycolumn on this name and the graph gives the columns to encode from, in order, and graphitron_node gives the prefix they are encoded under

source (CHARACTER VARYING, nullable)

where the tuple comes from, in a closed vocabulary of two: PROJECTED_COLUMNS where the key columns are selectable at the field’s own site and the encode wraps them at the projection, READ_VALUE where the field’s value arrives through a read and the encode applies to what the read yielded. The column a consumer switches on, and what says whether the arity demand applied

arity (INTEGER, nullable)

how many columns the node type’s key has, counted over the rows graphitron_node_keycolumn already answered with rather than by reading that relation a second time, which is the shape the fact model has measured as dominant on a comparable tree. Always 1 on a READ_VALUE row, that being the precondition; unbounded on a projection. Carried because a consumer emitting the encode needs the width and because a message about a refused sibling coordinate names this number

intent_node_id_polymorphic_decode_defect (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. What is wrong with a @nodeId instruction whose typeName: names a polymorphic container: one row per refused instruction, use site and, on the two member verdicts, member, in a closed verdict vocabulary of five. The sibling of intent_node_id_decode_defect and deliberately not new arms on it: that view’s whole design is two verdicts decided by the node key’s arity alone in one pass over two driving relations, and these five are decided on the coordinate, the member set and the slot’s type, which is a different fact base. The two populations are disjoint for a reason the incumbent already states rather than one asserted here: it joins intent_resolved_node_key_shape on the slot’s resolved type, and a container resolves no key of its own, so every row of this population misses that join and draws nothing there. Precedence runs outward in, and it is the remedy’s order rather than a ranking invented for tidiness. CONTAINER_NOT_AT_A_SLOT first, the coordinate deciding whether the polymorphic rule reaches the instruction at all before the member set is worth reading; then the two container verdicts, whose remedy is the container’s; then the two member ones. Two grains in one relation, with member_type_name NULL on the three container-grain verdicts and set on the two member ones, determined by the verdict the way the incumbent family determines nullness by its discriminator. One limit on how much of the rule this states, and it is the incumbent’s own population edge rather than a hole opened here. At an input-field site intent_node_id_decode_slot.java_type is the bean’s type and not the annotated member’s, the slot relation resolving the parameter at the root of the use site and deliberately declining to walk into the class, which is why the incumbent excludes that site outright and calls the shape owed an emitter rather than a verdict. So the container-side half of the rule is stated at every site and the slot-typing half, SLOT_NOT_SUPERTYPE_OF_MEMBER and the POLYMORPHIC_RECORD destination with it, only where the slot relation types the slot the author annotated. The walk refuses a mistyped bean member on its own, so no build goes silent; what narrows is the store’s agreement, and what would close it is the descent from a bean parameter to the member receiving the value, which is code_read_slot’s territory. Stating the edge is the point: a verdict that compared a container’s type against a member’s key would refuse a bean the author was right to declare. Two further shapes fall outside the partition and are enumerated rather than left to be discovered, both refused by the walk on its own. A polymorphic slot whose declared type no census could read draws neither a destination nor a verdict: unlike the single-column destination there is no arity-only fallback to stand aside onto, the emitted helper’s return type being the slot’s own type, so the walk refuses such a slot outright and a verdict comparing an unreadable type against a record would be inventing one of its operands. And an overloaded producer draws neither, this relation demanding one candidate rather than picking a type, which is the demand the slot relation’s own comment makes of a reader that needs the type and the same shape the incumbent enumerates for itself. There is no accept line and no population filter of its own, on intent_node_id_decode_defect’s settled terms: the build-error consumer joins the classification domain and the editor’s diagnostic arm reads these rows ungated, a refused instruction at an unreached coordinate being exactly where an author most needs to be told.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from the instruction; the leading key dimension

site (CHARACTER VARYING, nullable)

the instruction’s site, carried from the instruction: all three reach this relation, unlike the incumbent’s one, because CONTAINER_NOT_AT_A_SLOT is exactly the verdict an output field and an unreached read-side coordinate draw

type_name (CHARACTER VARYING, nullable)

the type owning the slot carrying the instruction, as on the instruction; with the field below, the coordinate a located error attaches to

field_name (CHARACTER VARYING, nullable)

the instruction’s field name, or on ARGUMENT the field the argument sits on

argument_name (CHARACTER VARYING, nullable)

the argument carrying the instruction on ARGUMENT; NULL on the two field sites, determined by site as on the instruction

path (CHARACTER VARYING, nullable)

the occurrence path this row’s use site is, on INPUT_FIELD; NULL on the other two sites, as on the instruction

use_site (CHARACTER VARYING, nullable)

the consuming coordinate serialized, carried from the instruction; with the graph and, on the member verdicts, the member, this relation’s key

container_name (CHARACTER VARYING, nullable)

the polymorphic container the instruction named, carried from graphitron_node_id_instruction.resolved_type_name; the name every one of the five refusals quotes, and the join key to intent_node_container_member for the members themselves

container_kind (CHARACTER VARYING, nullable)

UNION or INTERFACE, carried from intent_node_container_member. NULL where the container has no member row at all, which a union with no members and an interface nothing implements both are; that absence is the NO_TABLE_MEMBERS verdict’s own subject rather than a missing reading

verdict (CHARACTER VARYING, nullable)

which precondition stopped the polymorphic decode, in a closed vocabulary of five, precedence running outward in. CONTAINER_NOT_AT_A_SLOT: the use site draws no slot row, so the value binds a table predicate or encodes rather than descending into Java, and the polymorphic rule does not reach this coordinate; read as the slot relation’s absence rather than re-derived, which is the same absence the decode relation’s own arm fork reads. One cause of that absence is excluded, on intent_field_producer_method’s own terms: a producer class the classpath census never reached leaves the slot relation empty for a reason that is the capture’s and not the author’s, so such a coordinate draws nothing here rather than a refusal nobody could act on. SINGLE_TABLE_CONTAINER: the container carries @table itself, so every member shares one record class and one key and the single-type decode is what the author wants; the remedy is to name an object type or to make the container a node type. NO_TABLE_MEMBERS: no member binds a table, so there is nothing to decode an id into. MEMBER_NOT_NODE_TYPE: one row per table-bound member that is not a node type, a candidate set with a hole in it rejecting that member’s ids at runtime with nothing in the build saying so. SLOT_NOT_SUPERTYPE_OF_MEMBER: one row per member whose generated record the slot’s declared type is not, read off intent_record_slot_assignable rather than re-derived here. The walk splits that last one in two when it shapes a remedy, a slot typed as one member’s record and a scalar slot reading differently to an author; that is the walk shaping a message and not a second fact, so it is one verdict here

member_type_name (CHARACTER VARYING, nullable)

the member the verdict is about, on the two member-grain verdicts; NULL on the three container-grain ones, determined by the verdict beside it the way the incumbent family determines nullness by its discriminator

member_record_class (CHARACTER VARYING, nullable)

the member’s generated jOOQ record, on SLOT_NOT_SUPERTYPE_OF_MEMBER; the type a refusal names beside the slot’s own. NULL on every other verdict, none of which is about a record class

slot_java_type (CHARACTER VARYING, nullable)

the slot’s declared type as intent_node_id_decode_slot.java_type spells it, carried on the four verdicts that reach a slot at all and NULL on CONTAINER_NOT_AT_A_SLOT, whose whole subject is that no slot was reached. NULL too where the census could read no type, which the arity-independent verdicts are indifferent to and which SLOT_NOT_SUPERTYPE_OF_MEMBER demands against, refusing on an operand nobody could read being a new silence rather than the closing of one

param_name (CHARACTER VARYING, nullable)

the parameter the value would have reached, carried from the slot relation; NULL on CONTAINER_NOT_AT_A_SLOT, there being no slot. The name a refusal quotes when it tells an author which signature to change

root_type_name (CHARACTER VARYING, nullable)

the type owning the field the value’s descent starts at, carried from the slot relation; the instruction’s own type on CONTAINER_NOT_AT_A_SLOT, where no descent resolved and the coordinate is its own root

root_field_name (CHARACTER VARYING, nullable)

the field the descent starts at, on the same terms as the type beside it

root_argument_name (CHARACTER VARYING, nullable)

the argument the descent starts at, on the same terms; NULL where the instruction’s own coordinate has none

source_name (CHARACTER VARYING, nullable)

the SDL file the instruction was captured from, carried from the instruction so a located error needs no second join

source_line (INTEGER, nullable)

source line, 1-based per the graphql-java convention

source_column (INTEGER, nullable)

source column, 1-based per the graphql-java convention

intent_node_metadata_defect (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. What is wrong with the node-identity metadata a generated table class stated: one row per defect, over the sql_node_metadata rows and their entries alone. The rows it reads are transcription because a walk read them; this is not, because no walk read the verdict that metadata is malformed. Graphitron’s rule produces it, and every join is inside the jOOQ corpus, which is what makes it a derivation over one corpus rather than a validation smuggled into a crawler. Well-formed metadata is a sql_node_metadata row with no defect rows, and the conjunction is the whole test: no defect rows alone is also what a table publishing nothing at all has, that table having no metadata row to be well-formed. Every defect a table exhibits gets a row, with no first-failing short-circuit, so no evaluation order becomes normative; a reader wanting one message reduces by an ordering it owns. There is no reason-text column, deliberately: the closed defect vocabulary plus the witness columns already stored are the fact base, and message prose belongs with the consumer that composes it. Keyed on the catalog’s own key with no graph partition, as sql_name_matched_key_column is: the question is about a table, and a graph reaches it the way it reaches any source-keyed fact.

Columns
source_name (CHARACTER VARYING, nullable)

the table’s catalog partition, the first column of the sql_node_metadata key this row is about

table_schema (CHARACTER VARYING, nullable)

the table’s SQL schema

table_name (CHARACTER VARYING, nullable)

the table’s SQL name; with the two columns above, the metadata row this defect is about

defect (CHARACTER VARYING, nullable)

which defect, in a closed vocabulary of ten: TYPE_ID_NOT_DECLARED, TYPE_ID_NULL, TYPE_ID_WRONG_TYPE and TYPE_ID_EMPTY on the type-id constant; KEY_COLUMNS_NOT_DECLARED, KEY_COLUMNS_NULL, KEY_COLUMNS_WRONG_TYPE and KEY_COLUMNS_EMPTY on the key-columns constant; KEY_COLUMN_ENTRY_NULL and KEY_COLUMN_UNRESOLVED on one entry of it. The vocabulary is finer than the reflection probe it will eventually replace, which reports one message per constant however that constant went wrong: the store distinguishes the states because it holds the forms separately, and collapsing them here to match the probe would discard a distinction the rows already carry

position (INTEGER, nullable)

the offending entry’s index in the stated array, on the two per-entry defects; NULL on the eight that are about a whole constant, which is the stated absent bucket rather than a missing value

intent_poly_member (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. What a polymorphic container holds, read at the grain a derivation asks it: the two captured relations unioned under the intent_ family’s names. Over the base relations rather than over graphql_poly_member, which says the same thing: that view is for readers outside this store, and reading it here would put a second view body in every detection component that asks this question. The two populations are two captured relations, so this body is the union of them under one name, which is the name three derivations already spell. What it once carried and no longer needs to: the interface arm’s position was ranked by a window function over the whole partition, which a correlated probe cannot prune, so every reader paid to re-rank every implementor of every interface on every driving row. Capture writes that order now, and the note the old body owed its readers moves to the column that holds it. One reading of these rows is still a choice rather than a fact, and it is the mapping-constant fingerprint’s: its digest is over a handler list in this order, source order, where the legacy walk’s own order for the interface arm is graphql-java’s registration order, which is neither source order nor documented. Source order is the defensible one and the disagreement is the walk’s to lose, but nothing has adjudicated it and a reader minting a suffix from these rows should know it is choosing.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

container_name (CHARACTER VARYING, nullable)

the polymorphic type holding the member: the union on one arm, the interface on the other

container_kind (CHARACTER VARYING, nullable)

which population answered, a closed two-value domain: UNION for a member listed on a union declaration, INTERFACE for a type whose implements clause names the container. Provenance, and the axis a reader filters on when it means one of them

member_type_name (CHARACTER VARYING, nullable)

the object type the container resolves to; on the interface arm the implementing type, on the union arm the listed member

position (INTEGER, nullable)

source order within the container, 1-based on the interface arm and the union’s own authored ordinal on the union arm. Authored on the union arm and derived on the interface arm, from the implementor’s declaration site with the type name breaking a tie; see the relation’s own note on what that costs a reader fingerprinting an ordered list

intent_record_slot_assignable (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. Whether a node type’s generated record can land in a slot of a given declared type: one row per (node type, slot type) pair where the record is that type. The store’s answer to the question a live Class.isAssignableFrom answers at the walk, asked of a generated record against a slot the author declared, and the one relation both the polymorphic record destination and the polymorphic defect view’s slot verdict read, which is why it has a name rather than being the same expression written twice. Two arms over one captured fact and not a composition of two censuses, which is the whole of what makes it affordable, and the reason is that sql_table_record_supertype holds a closure rather than edges: the catalog walk climbs the live record class, so an interface a consumer’s jOOQ recordImplements option puts on the records is a row there and so is every supertype of that interface, at any depth. A census leg was written first, joining a closure over the classpath’s supertype edges to climb from a record-declared interface, and it was both redundant and unaffordable: redundant because the capture had already climbed that far, and unaffordable because H2 inlines a recursive view and re-evaluated the whole closure once per driving row, measured at two orders of magnitude over the two arms below and never returning against a real capture at all. Two rewrites of that leg were measured and neither helped, one unchanged and one worse; what fixed it was deleting it. The reflexive arm is there because assignability is reflexive and the walk’s comparison is: a slot typed as one candidate’s own record is assignable for that candidate and not for its siblings, and it is the sibling that refuses the slot. Total over the node population rather than seeded from the slot types a graph asks about, which was also tried and also cost: seeding pulled the decode-slot relation into the join and H2 re-evaluated it per driving row. Absence is not-known-to-be-assignable and never not-assignable, and the shortfall falls in one direction only; what bounds it here is that the closure is captured off a live class rather than reconstructed from anything, so the only pairs it misses are those of a table jOOQ generated no record for, which has no row at any slot type because the record class is NULL there.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from the key shape; the leading key dimension

node_type_name (CHARACTER VARYING, nullable)

the node type whose generated record the question is asked about. Keyed on the node type rather than on the record class because both readers hold a node type and neither holds a record class, and the class is carried beside it for a message that has to name it

record_class (CHARACTER VARYING, nullable)

the fully qualified name of that node type’s generated jOOQ record, carried from intent_resolved_node_key_shape.record_class. Payload rather than key, the node type beside it already fixing it; here because a refusal naming the slot type has to name the record that could not land in it

slot_type_name (CHARACTER VARYING, nullable)

one declared type the record is, spelled the way the reading spells a class name so a slot’s declared type compares to it exactly: the record class itself on the reflexive arm, one element of its captured closure on the other. Completing the key

intent_reference_for_application (view)

One @referenceFor application paired with a consuming coordinate that offers the participant it names: one row per application and consumer whose participant set holds the spelling. For example an application naming Film under an input type two queries consume draws a row for the query whose union holds Film and none for the query whose does not.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from the application

site (CHARACTER VARYING, nullable)

which SDL site carries the application, in the decode family’s vocabulary: INPUT_FIELD for graphitron_reference_for_entry on an input object’s field, ARGUMENT for graphitron_argument_reference_for_entry. The OUTPUT_FIELD site is absent structurally rather than by a kind test, an occurrence path’s leaf always being an input object type, so an application on an object field matches no occurrence and never enters the population

type_name (CHARACTER VARYING, nullable)

the type owning the application’s coordinate: the input object type on INPUT_FIELD, the argument’s owning type on ARGUMENT

field_name (CHARACTER VARYING, nullable)

the application’s field name, or on ARGUMENT the field the argument sits on

argument_name (CHARACTER VARYING, nullable)

the argument carrying the application on ARGUMENT; NULL on INPUT_FIELD, determined by site as on the captured relations this reads

ordinal (INTEGER, nullable)

the application’s position in document order, carried from the captured relation; with the four columns above, the application’s own key

consuming_type_name (CHARACTER VARYING, nullable)

the type owning the field whose participant set this row matched against: the occurrence path’s root field’s type on INPUT_FIELD, the argument’s own type on ARGUMENT. One application has one row per consumer that offers the participant, which is the whole reason the consumer is part of the grain: an input type consumed by two queries with different participant sets applies at one and is inert at the other

consuming_field_name (CHARACTER VARYING, nullable)

the consuming field’s name, on the same terms as the type beside it; equal to field_name on ARGUMENT, where an argument’s consumer is the field it sits on

participant_type_name (CHARACTER VARYING, nullable)

the table-bound participant the application’s participant_type_ref matched at this consumer, as intent_field_participant_scope_table spells it. The resolved name rather than the authored spelling, so a reader holding this row needs no second match

table_source_name (CHARACTER VARYING, nullable)

the catalog partition of the table the matched participant binds, carried from the participant relation. With the two columns below it, what says which branch of a polymorphic consumer this application applies to

table_schema (CHARACTER VARYING, nullable)

the participant table’s SQL schema

table_name (CHARACTER VARYING, nullable)

the participant table’s SQL name; the branch, and what a reader over a per-branch relation joins on. Two participants of one consumer binding one table are two rows here, the grain being the participant, so a reader keyed on the table alone sees the table and not which of the two

intent_resolved_field_claim (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. The field-grain claim resolution: the authored relation unioned with the inferred rows at coordinates the authored relation does not cover. Masking is this join’s job, never a classifier’s guard, and the anti-join sits at the coordinate grain: any authored claim at a coordinate masks every structural reading there, presence arms included, because a directive whose decode declined still diverted the walk. The projection is the claim key plus tier, no trigger, decoded or witness component, so nothing goes nullable by kind; a reader wanting provenance joins the tier’s own view, and tier is a column precisely so that home is a read rather than a hand-maintained classifier-to-relation mapping. The stratum’s second layer, and what a planning reader eventually joins.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from the claim views

type_name (CHARACTER VARYING, nullable)

the claimed field’s owning type

field_name (CHARACTER VARYING, nullable)

the claimed field’s name within the owning type

classifier (CHARACTER VARYING, nullable)

the classification kind the claim is for, the union of the claim views' closed vocabularies

tier (CHARACTER VARYING, nullable)

AUTHORED from the authored view, INFERRED from a classifier view surviving the anti-join; names which relation carries this claim’s provenance

intent_resolved_field_demand (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. The field-grain demand reduction: one verdict per accounted coordinate of the classification domain, over every field-bearing parent kind (input coordinates resolve EXEMPT here rather than falling outside the domain). Demand beats exemption where both relations carry the parent (a @table type shaped like a connection classifies its fields, so the demand reading wins, matching the walk); within each side the rule is the first arm in the vocabularies' declared order, so the more specific reading names the row (machinery beats the directiveless catch-all). A domain coordinate with neither reading has no row: by construction the nesting-target arm complements the demand arms over plain objects, so absence marks the shadow residue (reflection-bound parents), and the agreement’s coverage gate counts resolved rows against domain coordinates to keep that construction honest. The future demand gate is this view’s DEMANDED rows anti-joined against the resolved claim view; nothing gates on it in shadow.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from the domain

type_name (CHARACTER VARYING, nullable)

the coordinate’s owning type

field_name (CHARACTER VARYING, nullable)

the coordinate’s field name

verdict (CHARACTER VARYING, nullable)

DEMANDED when any demand rule covers the parent, else EXEMPT; a closed two-value vocabulary

rule (CHARACTER VARYING, nullable)

the winning rule or reason literal, drawn from the rule views' closed vocabularies in their declared precedence order

intent_resolved_node_key_projection (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. An argMapping binding that decodes a node id and projects one column out of the decoded key, where the projected value can actually reach the parameter it is bound to: the candidate rows beside it, joined to the consuming parameter’s own Java type and kept only where the two agree. The reduction the whole item turns on, and the row an emitter reads to know which column of a decoded record to hand a routine parameter. A reduction over the relations beside it rather than a derivation of its own, which is what the resolved_ prefix names: the path resolution is graphitron_argmapping_match’s, the key list is graphitron_node_keycolumn’s, the name match and the column’s type are intent_argmapping_key_column_candidate’s, and the parameter’s type is intent_argmapping_bound_parameter_type’s; this is only where they meet. The type agreement is a join predicate and not a check performed after the fact, which is the whole of why it is sound: an emitter reads this relation, so a pair whose types disagree is not a projection an emitter can see, and there is no order of operations in which one is emitted and then rejected. Equality of the erased Java type, no widening admitted: a SMALLINT key column bound to an Integer parameter is a disagreement here, and whether that is a mismatch worth telling an author about is a question the detection’s message answers rather than one this predicate softens, softening it being what would let a narrowing through. The gate fires only where both operands are known, and standing aside on either absence is the deliberate half. A parameter whose type intent_argmapping_bound_parameter_type cannot state (a consumer compiled without -parameters and a reference resolving no method, which draw no row there at all, and a declared type naming no class, which draws a row carrying a NULL type) and a column the catalog cannot type (a node type with no unambiguous table binding, a pinned key column the bound table does not have) both leave the pair projecting exactly as it did before this predicate existed. Requiring the match in either case would have turned such a pair into one that is neither a projection nor a defect, which is the silence this whole family exists to close, and on the column side it would additionally have contradicted the key-column relation’s own rule that a pinned name resolves without a table. Standing aside leaves those where they were, projections whose types this gate never checked. What becomes of them afterwards is no longer one answer, and the split is worth stating here because an emitter reads this relation. A parameter declared as a Java primitive is refused by ArgmappingProjectionDefects before emission: the projected read is a boxed local at every shape of nullability along the path, an omitted @nodeId anywhere on it projecting null, and the compiler catches nothing at int p = <boxed null>. An array or type-variable parameter, and every absence that draws no row here at all, keep the compiler’s own error as the backstop they always had. So the gate strictly adds rejections and removes no emission, which is what makes it safe to land as a join rather than as a staged flip. One trailing name or none, never two and never a minimum, and where there is one it is what the written path spells past the candidate that bound: all of that is the match relation’s, stated there. The none case is the inferred form, a one-column key needing no name to select it, and it resolves here on exactly the terms the authored form does: the same column, the same type reached the same way, the same row shape. So this relation is read without asking which of them a row came from, which is what makes the two one emission rather than two. Which arm answered rides here all the same, on trailing_name, because an emitter needs one fact the row shape does not otherwise carry: where in the written path the wire id it decodes sits. That is provenance a reader may ignore and an emitter must not, so it is carried rather than left one join away on the candidate. Absence means this pair is not a projection, and every way of arriving at that absence is a query over the relations beside it rather than a fact this one withheld: a leaf with nothing trailing under a key of two or more columns is the bare form a rejection closes, a leaf with two or more trailing segments is the typo, a trailing segment matching no key column is the unknown column, a candidate whose types disagree is the type mismatch, a leaf carrying @nodeId with no typeName: is the missing type name, and a pair with no leaf row at all is a path the walk rejects before the store is written. None of them is this relation’s to report, which is what keeps it a positive population an emitter can trust rather than a verdict it has to interpret.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from both sides of the reduction, which agree on it by the join

site (CHARACTER VARYING, nullable)

which SDL site spelled the pair, in graphitron_argmapping_entry’s closed vocabulary of nine; the column a consumer reads to know whether an emitter is wired for this projection yet

use_site (CHARACTER VARYING, nullable)

the consuming coordinate, serialized as graphitron_argmapping_entry serializes it; with site and position the grain, and the key a planner joins the pair relation on to recover the application ordinal a command row needs

type_name (CHARACTER VARYING, nullable)

the spelling site’s owning type

field_name (CHARACTER VARYING, nullable)

the spelling site’s field name within that type

position (INTEGER, nullable)

the pair’s 0-based position within its own argMapping list; two parameters bound from one node id are two rows at two positions, which is what lets a composite key fill both

written_path (CHARACTER VARYING, nullable)

the path as written, carried so a message quotes the author’s own spelling rather than the resolution’s

bound_kind (CHARACTER VARYING, nullable)

ARGUMENT where the decoded node id is a field argument, INPUT_FIELD where it is an input field reached below one; carried from the binding resolution, and what tells an emitter which slot the wire value is read out of

bound_type_name (CHARACTER VARYING, nullable)

the leaf’s owning type, carried from the binding resolution

bound_field_name (CHARACTER VARYING, nullable)

the leaf’s owning field on an ARGUMENT leaf, the input field itself on an INPUT_FIELD leaf

bound_argument_name (CHARACTER VARYING, nullable)

the argument’s name on an ARGUMENT leaf; NULL on an INPUT_FIELD leaf, whose key needs no argument component

node_type_name (CHARACTER VARYING, nullable)

the node type the leaf’s @nodeId names, as written; what the wire id decodes against, and the type whose key list the column below belongs to

column_name (CHARACTER VARYING, nullable)

the projected key column, spelled as the winning key-column tier spells it rather than as the author wrote it: the decode returns values against that tier’s list, so this is the spelling that lines up with it. The author’s own spelling is in the path, one segment join away

key_position (INTEGER, nullable)

the projected column’s 0-based position within the node key. Not what an emitter reads (it names the column) but what a reader checking a composite projection asks, and what shows two parameters bound from one id take two different positions of one key

tier (CHARACTER VARYING, nullable)

which key-column population answered for this node type, carried from graphitron_node_keycolumn’s closed vocabulary of three; a diagnostic explaining why a column is or is not available reads it rather than re-deriving the precedence

column_java_type (CHARACTER VARYING, nullable)

the projected column’s Java type as jOOQ binds it, fully qualified; carried from the candidate relation. Equal to the column beside it by the join, and both are kept because a reader of one row should not have to know which side of an equality it is looking at

param_java_type (CHARACTER VARYING, nullable)

the consuming parameter’s Java type, fully qualified, from intent_argmapping_bound_parameter_type; equal to the column beside it wherever it is non-NULL, that equality being the gate this relation adds over its candidate. NULL where the parameter’s type does not resolve, which is a projection the gate stood aside for rather than one it approved; the view comment says why standing aside is the right reading and what the remaining backstop is

leaf_is_list (BOOLEAN, nullable)

whether the decoded node id is list-shaped, carried from the candidate. TRUE is a projection naming the list of this column across the decoded ids: a coherent request, so it resolves here rather than being withheld, and the consumer defers on it because no emitter builds that shape yet. A reader emitting from this relation must therefore consult it, which is why it is carried rather than filtered: filtering would have made an unbuilt shape indistinguishable from a spelling nobody asked for

trailing_name (CHARACTER VARYING, nullable)

the one name the author spelled past the node id to select this column, as written, or NULL where they spelled none and the key’s arity inferred it; carried from the match relation, whose own comment states how the two arms reach one column. Which arm answered, and the one thing an emitter cannot derive from the row it already has: the wire id it decodes sits at the written path minus this segment where it is non-NULL, and at the whole written path where it is NULL. Carried rather than re-joined because an emitter holds no candidate row and no path-segment relation, and because deriving it from the path’s shape is exactly the off-by-one the two arms make unconstructable: both spellings are dotted paths of the same arity at a nested leaf, so nothing about the path itself tells them apart

intent_resolved_node_key_shape (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. A node type’s key reduced to what a slot receiving it has to agree with: how many columns the key has, the row type that carries the whole tuple, and where the key is one column that column’s name and the Java type it binds as. The relation a destination or a refusal reads when the question is not which columns the key is but whether a given slot can hold it. Every value here is a function of the key-column relation beside it and the type’s own table binding, so this states no new fact and exists for one reason: three consumers would otherwise each aggregate the key list and each re-resolve the binding, which is the inline multiplicity the fact model’s own measurements warn about, and a reader that wants the columns themselves still reads the relation this reduces. Arity is a count over the winning tier’s whole list, which is sound only because that relation picks a tier rather than a position; a per-position pick would make this number the count of a spliced list. It is counted before the two catalog reaches below it rather than after, which is not a stylistic ordering: either outer join can in principle match a key column twice, two catalog columns folding to one name being the case, and a count taken after that would report a key longer than the key is. The record class is the generated row type of the type’s own table, absent where the binding is ambiguous, where no table binds at all, and where the catalog answers org.jooq.Record, which sql_table’s own comment says is the catalog reporting no generated record rather than a record named that; the exclusion is a join predicate here so that absence is one thing at every reader instead of two. The two sole_ columns are stated only at arity one and are NULL above it, which is determined by the arity beside them rather than by anything unknown: a composite key has no single column, so a NULL here at arity two is the key’s shape and not a missing reading. Their absence at arity one is the ordinary catalog absence: a pinned key column resolves with no table at all, on the key-column relation’s own rule, so a name that names nothing the table has still has a row there and reaches no type here. A reader gating on type agreement therefore stands aside on the NULL rather than refusing, which is the discipline intent_resolved_node_key_projection already states for its own version of this operand.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from the key-column relation

type_name (CHARACTER VARYING, nullable)

the graph type whose node key this row describes; one row per type that resolved any key column at all, and no row for a type that resolved none

arity (INTEGER, nullable)

how many columns the winning tier’s key list has, one or more. The number a refusal at a single-valued slot quotes, and the number that decides whether such a slot can carry the decode at all

record_class (CHARACTER VARYING, nullable)

the fully qualified name of the generated jOOQ record for the type’s own table, which is the row type that can hold the whole key tuple whatever its arity. NULL where the type’s table binding is ambiguous or absent, and NULL where jOOQ generated no record class for the bound table. Spelled as the reading spells a class name, so a parameter’s declared type compares to it exactly; the reading never scanned the generated package, so a name here is no promise that code_class holds the class, on intent_type_backing.class_name’s terms

sole_column_name (CHARACTER VARYING, nullable)

at arity one, that column’s name as the winning tier spells it, carried so a message about a single-valued slot need not re-join the key list; NULL at any higher arity, where there is no single column to name

sole_column_java_type (CHARACTER VARYING, nullable)

at arity one, the Java type jOOQ binds that column as, from sql_column.binding_type: the value a single-valued slot would receive, and the left operand of the agreement such a slot requires. NULL at any higher arity by the shape of the key, and NULL at arity one where the catalog cannot answer, which is an ambiguous or absent table binding or a pinned column name the bound table does not have. A reader cannot tell those two apart from this column alone and does not need to: it reads the arity beside it first, and above one the agreement is not the question

intent_resolved_type_demand (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. The type-grain demand reduction over the classification domain, mirroring the field-grain reduction: demand beats exemption, first declared arm wins within a side, and a domain member with neither reading has no row, which marks the type grain’s shadow residue (directiveless objects whose registration is decided by the embedding walk and the reflection fixed point). The shadow agreement splits that absent population into its named parts rather than treating it as one structural bucket.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from the domain

type_name (CHARACTER VARYING, nullable)

the domain member the verdict is about

verdict (CHARACTER VARYING, nullable)

DEMANDED when any type demand rule covers the member, else EXEMPT; a closed two-value vocabulary

rule (CHARACTER VARYING, nullable)

the winning rule or reason literal, drawn from the rule views' closed vocabularies in their declared precedence order

intent_routine_return_binding (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. Which catalog table a type is bound to by being what a @routine chain field returns: intent_field_chain_terminus keyed by the returned type rather than by the field. This is the binding a @routine author writes @table for today, derived instead, so the routine name is written once and the two spellings can no longer disagree. The type read is intent_field_navigated_type’s, so a connection-returning routine field binds its element type and not the wrapper, whether the generator synthesised that connection or the author declared it; that navigation is stated once in that relation and read here rather than spelled again. OBJECT only, a landing being a row and a row standing for an object type. The population is the chain read seats, and one seat is excluded: the payload carrier, a mutation root’s @routine field carrying no @reference, whose chain rows are not what the field returns but what its data field re-reads post-commit, so a binding there would name a table for a type no table stands for. The exclusion names that seat rather than the carrier because the store holds no carrier fact yet; the seat is the classifier’s own fork, which reaches the carrier resolution exactly when the parent is the mutation root and the chain has a single node, and it narrows to the carrier itself the day a carrier relation lands. That day has come and the narrowing is deliberately not taken here: intent_mutation_routine_seat states the same fork as its seat column, so the exclusion could read seat = CARRIER and mean exactly what it means today, but narrowing to the carrier itself means excluding only the seats that hold, which hands a binding to every mutation-root @routine this relation currently keeps out and changes the arity every reader of the reduction sees. That is a change to make on its own evidence, not in passing. The seat exclusion costs the routine write chain nothing, that shape carrying @reference by construction. Keyed on the root operation binding and not on the literal name Mutation, the same intended-rule form the demand rules and intent_field_separate_fetch’s root arm state. Ambiguity is rows, never a decline, on intent_bound_table’s terms: two fields returning one type off different routines are two rows and candidates says so. Nothing here is masked by an author’s @table, a type carrying both being a fact about the schema and not a conflict for this relation to settle; where the two populations meet is graphitron_resolved_type_binding.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from the chain terminus

type_name (CHARACTER VARYING, nullable)

the type this row binds: the named type of the expression the returning field was written with, its list and non-null wrappers stripped

table_source_name (CHARACTER VARYING, nullable)

the landing table’s catalog partition, the first column of the sql_table key this row names

table_schema (CHARACTER VARYING, nullable)

the landing table’s SQL schema; what tells two candidates of one name apart

table_name (CHARACTER VARYING, nullable)

the landing table’s SQL name. With the two columns above this is sql_table’s full key, so the table’s kind, its columns and its generated record are each one join away

candidates (INTEGER, nullable)

how many distinct tables this type’s routine-returning fields land on, this row’s table being one of them; 1 on an unambiguous binding. Counted over this relation’s own rows rather than carried from the terminus, because a type two fields return is ambiguous here even where each field’s own chain lands certainly; stated as a column rather than left to each reader’s own count, on intent_bound_table.candidates' terms

intent_table_key_candidate (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. The keys a consumer may identify a row of a table by, in the order the generator considers them. One row per surviving candidate, ranked, and the rank is the whole point: a write surface handed a set of columns takes the first candidate those columns cover, so a relation that listed the candidates unordered would leave the choice to whoever read it and two readers could disagree. The order is the generated model’s own, the primary key first and the remaining unique keys in the enumeration jOOQ hands out, which is why sql_constraint.key_position is captured rather than derived. Two projections come with that order and both are the generator’s rather than this relation’s. A unique key whose column set an earlier candidate already carries is dropped, so a table whose primary key is also declared unique offers one candidate and not two, and the survivor is the earlier one, which is the primary key whenever the primary key is in the tie. And a unique key resolving no columns at all is dropped, where a primary key in that state is kept: an empty primary key is a fact about a table nothing can identify a row of, and a consumer meets it as a candidate that covers nothing rather than as a table with no candidates. That the columns resolve at all is a property of capture here rather than a case to handle: sql_constraint_column carries a foreign key into sql_column, so a key naming a column the catalog does not have could not have been written. Absence is a table declaring no uniqueness constraint, which is every view and every table nothing identifies a row of, and it is what a write surface needing an identity meets when it finds nothing to cover. The columns themselves are not here. They are sql_constraint_column’s, in its own position order, joined on the constraint name this relation gives; putting them here would make the grain a column and the rank would have to be repeated down every row of a key.

Columns
source_name (CHARACTER VARYING, nullable)

the owning catalog partition’s generated-package source, carried from sql_constraint

table_schema (CHARACTER VARYING, nullable)

the table’s SQL schema

table_name (CHARACTER VARYING, nullable)

the table’s SQL name; with the two columns above, sql_table’s key

constraint_name (CHARACTER VARYING, nullable)

the surviving candidate’s constraint name, sql_constraint’s key within the table and what a reader joins sql_constraint_column on to get the key’s columns in position order

primary_key (BOOLEAN, nullable)

whether this candidate is the table’s primary key. Not the rank: a table may declare a primary key and unique keys alike, and the rank already says which comes first, so this says which kind of identity a consumer ended up with when it reports one

candidate_rank (INTEGER, nullable)

where this candidate sits among the survivors, counting from zero, in the order a consumer considers them: the primary key first where there is one, then the unique keys in the generated model’s enumeration. A consumer taking the first candidate its columns cover reads this ascending and stops

intent_type_backing (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. What class stands for a graph’s type, from either population that can answer: the type’s table binding read through the table’s generated record, and the closure over producer returns and accessor hops. The table arm reads graphitron_resolved_type_binding and not the @table population alone, because what puts a generated record behind a type is that some table stands for it, and a routine chain’s return binding stands for one exactly as a written @table does; a reader wanting only the written population joins the arm. One relation for the question every consumer of a backing actually asks, which is what class, not which walk found it. A view coalescing two relations rather than a base with a provenance tag, on the stratum’s provenance rule: each population is derived by its own rule from its own facts and neither is a special case of the other, so they are separate relations and this is where they meet. Both arms carry the same payload, one binary class name, and they can do that only because sql_table records the record class; before that fact was captured the arms had nothing in common and this view could not be stated without four columns NULL by kind. A table whose generated model has no record class reports org.jooq.Record, and that is not a backing, so the arm drops it and the type is unbacked here, the same silence a type no producer reaches already gets. Ambiguity is rows on both arms and nothing is preferred: a type its @table binding and its closure answer differently is two rows, and intent_type_backing_conflict over this view is where a reader learns so. The walk resolves that pair by precedence, reading the table and never looking at the class, which is a reading a consumer may still apply by filtering on declared_via; what it may not do here is mistake the precedence for agreement.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from whichever arm produced the row

type_name (CHARACTER VARYING, nullable)

the SDL type the class stands for

class_name (CHARACTER VARYING, nullable)

the fully-qualified binary name of the backing class, spelled as the reading spells a class name on both arms. On the table arm this is the generated jOOQ record, which the reading deliberately never scanned, so a class name here is not a promise that code_class holds the class

declared_via (CHARACTER VARYING, nullable)

which population answered, a closed two-value domain: BOUND_TABLE for the resolved table binding read through its table’s record class, whichever rule bound it, BACKING_CLOSURE for the reachability over producer returns and accessor hops. Provenance, never a preference; a reader that wants one arm filters on it and owns having chosen

intent_type_backing_class

A graph’s type is backed by a class: the reachability of intent_field_accessor_hop’s edges from the classes the graph’s producer methods deliver. For example a type whose only producer method returns a FilmRecord draws one row naming that record class.

Primary key: (graph_name, type_name, class_name). Foreign key: (graph_name) references store_graph (graph_name). Foreign key: (graph_name, type_name) references graphql_type_element (graph_name, type_name).

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

type_name (CHARACTER VARYING, not null)

the SDL type the class backs; an object or an input object, and a captured type, which is what makes the type FK structural

class_name (CHARACTER VARYING, not null)

the fully-qualified binary name of the class backing the type, spelled as the reading spells a class name so the two join without normalising. Not a foreign key, on code_type_element.element_class’s terms: a class the census never reached is the ordinary case at the end of a declared type, and what a producer delivers is a fact whether or not an entry declared it. Not unique per type either, ambiguity being rows here

intent_type_backing_conflict (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. The types the store answers with more than one backing class: one row per type whose producers, accessor hops and @table binding do not all name the same class. Stated over the coalesced intent_type_backing rather than over one arm, because a type contested across the two populations is contested in exactly the sense a consumer needing one class cares about, and an arm-local view would have called that agreement. Two disagreements therefore land here. Two producers answering differently is the one the closure surfaces, a population nobody could previously ask about: the walk resolves it by refusing the second observation and folding the survivors, so a contradiction between producers is either invisible or arrives as a rejection with the losing side already discarded. A @table binding and a reached class answering differently is the other, which the walk resolves by precedence, reading the table without ever consulting the class; that is a defensible reading and a consumer may still apply it, but it is a choice, and a relation that folded it in would have hidden the choice rather than recorded it. Counted over distinct class names, not rows, so one class both arms name is one answer and not a contest. The arity is all this relation adds: the contesting classes themselves are rows on intent_type_backing under this relation’s own key, so a consumer wanting them joins there and gets one row per class, where a set serialized into one column here would have answered set equality and nothing else. A view over the coalesce rather than a column on the closure, on intent_authored_claim_conflict’s terms: the contested population is a grouping over rows already held, and it costs nothing to state on read. Nothing gates on these rows yet. The reading this relation is shaped for is that a contested type is a rejection at whichever consumer needs one class, and the arity is what such a rejection stands on, which is why it is here rather than left to each reader’s own count.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from intent_type_backing

type_name (CHARACTER VARYING, nullable)

the contested SDL type

candidates (INTEGER, nullable)

how many distinct classes back the type, always two or more here; distinct, so a class both arms name counts once, and the arity a rejection stands on, on intent_bound_table.candidates' terms

intent_type_backing_seed (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. A graph’s type is backed by this class by a producer of its own, rather than by being read off some other type’s class. Two arms, one per axis, and they are the seeds intent_type_backing_class closes over: a field with an authored Java reference backs the type it returns with the class the resolved method delivers, and a producer’s parameter backs the type of the argument it is fed from with the class that parameter delivers. Which argument feeds a parameter is the parameter’s own name unless an argMapping entry redirects it, in which case it is the first name of the written path, which that relation carries as a generated column. Objects and input objects only, as in the closure, and a parameter the consumer compiled without -parameters feeds nothing. This relation resolves its producers against the reading where the closure’s skip condition reads the directive entries, and the split is the two questions they answer: which class a producer delivers is knowable only from the method the reference matched, while whether a coordinate is read off its parent is settled by the author having applied the directive at all. So a producer naming a class no entry declared seeds nothing here and still stops the hop there, and the type it names is unbacked rather than backed by whatever member of the parent’s class shares the field’s name. Every row here is a row of intent_type_backing_class too, this relation being where that one starts; what it adds is which of that relation’s rows a producer grounded. Not a column on the closure, for the reason that relation gives for having no route column: a class reached both by a seed and by a hop is one backing and one row there, and a route column would multiply every reader’s rows by however many routes converged. Kept as its own relation, grounding is a join and the closure keeps its grain. Why a reader would want it: the classification walk this family shadows settles a type’s groundings before it propagates anything, and then declines to read an already-grounded type off a parent’s member, because a hop reads the parent’s member type without checking it against the child’s own grounding and can therefore land on a class that is simply wrong. A reader reproducing that precedence takes a type’s rows from here when it has any and from the closure otherwise. The precedence is the reader’s and not this relation’s, which states only where a backing came from.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from intent_field_producer_method

type_name (CHARACTER VARYING, nullable)

the SDL type the producer grounds; the field’s named type on the return arm, the argument’s named type on the parameter arm

class_name (CHARACTER VARYING, nullable)

the fully-qualified binary name of the class the producer delivers at that position, once the containers come off; spelled as the reading spells a class name, on intent_type_backing_class.class_name’s terms

intent_type_demand (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. The types that require a type-grain classification verdict. Directly type-grain (no projection involved): the root arm states the intended binding-keyed rule (today’s walk mints RootType for the three literal names, so a renamed root type is a pinned demanded-but-unregistered population, the same hole as its fields); every reachable interface and union classifies at its own visit, so those arms are kind-wide less the underscore short-circuit; connection machinery types are registered by the promotion that recognizes them, so the machinery reading appears here as demand while the same types' fields are exempt, and the arm reuses the exemption view’s recognition rather than restating it; producer payloads take a carrier or result verdict at their producing edge, reused from the field-rule arm the same way. Directiveless objects with no producer are deliberately absent from both this view and the type exemption: whether such a type ends registered (a nesting target some edge embeds) or absent (an orphan) is decided by the embedding walk and the reflection fixed point, which is the type grain’s shadow residue until those arms migrate. Leaf kinds (scalar, enum, input) are the exemption view’s named deferral rather than absent rows.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried through from every arm’s base relation

type_name (CHARACTER VARYING, nullable)

the type the rule demands a verdict for

rule (CHARACTER VARYING, nullable)

why the type is demanded; a closed vocabulary (ROOT_OPERATION, TABLE_TYPE, ERROR_TYPE, INTERFACE_TYPE, UNION_TYPE, CONNECTION_MACHINERY, PRODUCER_PAYLOAD)

intent_type_domain

The classification domain’s type members: every named type, of every kind, the generator’s intended traversal reaches from its seeds. For example a graph whose Query.films returns Film draws a row for Query and one for Film, and a type nothing reachable names draws none.

Primary key: (graph_name, type_name). Foreign key: (graph_name, type_name) references graphitron_type (graph_name, type_name).

Columns
graph_name (CHARACTER VARYING, not null)

the owning graph’s partition, anchored by store_graph; the leading key dimension that keeps one workspace’s graphs apart

type_name (CHARACTER VARYING, not null)

a member of the graph’s classification domain; lands only on captured types, which is what makes the type FK structural

intent_type_exemption (view)

Deprecated with the whole intent_ family, which has no owning gatherer and is being retired. A fact derived here belongs in the family that owns the corpus it comes from, captured as early as it can be so that every reader reaches it instead of deriving it again. The types whose type-grain verdict is intentionally not demanded yet. The underscore arm transcribes the walk’s name short-circuit at every kind (a federation-injected _Service or _Entity, and any author-declared underscore type, never classifies). The leaf-kind deferral arm is a bound carried as rows rather than a test-side filter: reachable scalars, enums and input objects do receive verdicts today, but their demand rules belong to those classifiers' own migration slices, so this arm retires arm-by-arm as they land and the shadow agreement reads the bound as data. Arms are unmasked; the resolved view owns precedence.

Columns
graph_name (CHARACTER VARYING, nullable)

the owning graph’s partition, carried from graphql_type

type_name (CHARACTER VARYING, nullable)

the exempted type

reason (CHARACTER VARYING, nullable)

why the type’s verdict is not demanded; a closed vocabulary (UNDERSCORE_TYPE, LEAF_KIND_DEFERRED)