on master help sign in
Add source-defined qath inference and explicit proj decision
commit0ea700d66b7974a7c86d16ff17c325eb422051b9 authoriko <mail@iko.soy> dateSat 31 Oct 2026, 06:39 (3 hours ago) parentba1fec4
44 files changed+1853−430
docs/compiler.md+2 docs/development.md+2 docs/open-questions.md+3−1 docs/prelude-inventory.md+1−1 docs/prompts/milestone-2.md+2−1 docs/spec/core-language.md+2−1 docs/spec/decisions.md+1 docs/spec/grammar.md+2−2 docs/status.md+12−6 jibb-dev/lib/jibb.hoon+159−9 jibb-dev/lib/jibb/internal.jibb+5 jibb-dev/lib/jibb/prelude.jibb+1 tests/golden/types-qath-faces/about.txt+4 tests/golden/types-qath-faces/modules.txt+1 tests/golden/types-qath-faces/source.jibb+8 tests/golden/types-qath-faces/tokens.txt+130 tests/golden/types-qath-faces/tree.txt+59 tests/golden/types-qath-faces/types.txt+18 tests/golden/types-qath-holes/about.txt+4 tests/golden/types-qath-holes/modules.txt+1 tests/golden/types-qath-holes/source.jibb+18 tests/golden/types-qath-holes/tokens.txt+178 tests/golden/types-qath-holes/tree.txt+78 tests/golden/types-qath-holes/types.txt+22 tests/golden/types-qath-module-identity/about.txt+4 tests/golden/types-qath-module-identity/module-trees.txt+44 tests/golden/types-qath-module-identity/modules.txt+3 tests/golden/types-qath-module-identity/modules/ui/mid.jibb+4 tests/golden/types-qath-module-identity/modules/ui/one.jibb+7 tests/golden/types-qath-module-identity/modules/ui/two.jibb+4 tests/golden/types-qath-module-identity/source.jibb+15 tests/golden/types-qath-module-identity/tokens.txt+171 tests/golden/types-qath-module-identity/tree.txt+70 tests/golden/types-qath-module-identity/types.txt+18 tests/golden/types-qath-recursive/about.txt+4 tests/golden/types-qath-recursive/modules.txt+1 tests/golden/types-qath-recursive/source.jibb+19 tests/golden/types-qath-recursive/tokens.txt+145 tests/golden/types-qath-recursive/tree.txt+63 tests/golden/types-qath-recursive/types.txt+14 tests/lib/jibb-qath-fuel.hoon+52 tests/lib/jibb-qath-source.hoon+34 tests/lib/jibb.hoon+437−409 tools/type-qath-guards-test+31
docs/compiler.md+2
@@ -88,6 +88,8 @@ The separate `jibb-dev/lib/jibb-import.hoon` is an unfinished reader for selecte
8888
8989Self-recursive `/sur` molds can cross the bridge as opaque module-and-name identities when their supported source-aware graph passes validation, including one-argument lists containing same-origin recursive references. The real Tlon `notes.import-node` reaches this bridge; it does not unfold or construct the recursive type. Aliases, foreign references, recursive marks, unfolding, construction and field access remain unsupported; the partial printer declines recursive names that are not in scope.
9090
91+The partial checker also recognizes a source-proven Jibb recursive mold consisting of `~` and one faced cell with a fixed-aura head and direct self tail. Its identity includes the defining path and name. It unfolds this shape for supported null and cell construction and for a two-arm null/cell match; static application-path literals use the verified public `qath` alias. The internal prelude defines `qath` as a transparent knot sequence and the public prelude re-exports it. Each inference attempt has 256 unfolding and static-segment steps; parsing and separate retries are not bounded by that limit. Dynamic application-path segments, broader patterns and other recursive shapes remain unsupported. Route and static-file existence checks remain milestone 4.
92+
9193Callers that have a `/sur` core and a name can use `+read-named`: it checks for a locally declared arm before asking Hoon to evaluate the mold, and reports evaluation failures with the final Hoon trace line. `+read-mold-in` remains available when the caller already has the selected type. The opt-in `+read-named-diagnostic` and `+read-mark-diagnostic` preserve successful graphs and distinguish definite `%invalid` aura and core evidence emitted directly by the reader from `%unsupported` failures. Other failures, including unverified union disjointness and vase recognition based only on a name, remain unsupported. These entry points revalidate and re-walk failed types; the opt-in `+golden-types-with-reader-diagnostics` accepts unchanged structured reader results and reports definite aura or core errors at their imported mold use sites, when the import and supplied input are unique. Ordered replay covers direct and nested cell samples, record and function casts, and non-generic same-module aliases; it stops at an unsupported prefix, cycle or shadowing failure. Union molds, generic applications, transitive modules and unsupported reader outcomes still report generic limitations. Replay repeats inference and may add work; this entry point remains partial. Existing checker entry points continue treating failed imports as unsupported. It also fails closed on repeated field faces along an imported record spine, including recursive roots; the diagnostic remains generic. Hoon type graphs can erase unfaced nested-cell boundaries, so the check may conservatively reject a valid source with equal names in distinct erased scopes. Faced nested records and union alternatives keep separate scopes.
9294
9395The partial report can diagnose certain non-gate value dependency cycles, including cycles through gates. It requires an explicit atom or loobean result cast and a syntactically proven dependency group with unshadowed simple samples; it identifies the value and a dependency site. Untyped results, branches, nested definitions, qualified wings and complex samples remain unsupported. The proof constructs an additional dependency graph. One 24-case recursive/generic eval run took 19.7 s with it and 18.6 s before it, including startup; these single runs do not isolate the graph cost.
docs/development.md+2
@@ -68,6 +68,7 @@ git clone https://github.com/urbit/tools /root/src/tools
6868| `tools/type-api-paths-test` | Checks partial API path analysis with real todo mark samples against `tests/type-api-paths/expected.txt` under eval |
6969| `tools/type-hole-guards-test` | Runs the shared hole-defaulting and API interface guards under eval; the same checks run on the ship |
7070| `tools/type-list-alias-test` | Runs the shared prelude list-alias and provenance guards under eval and on the ship |
71+| `tools/type-qath-guards-test` | Runs source-provenance, recursive unfolding and face guards under eval and on the ship |
7172| `tools/type-module-scope-test` | Checks the partial module checker’s prelude boundary and duplicate-source rejection against `tests/type-module-scope/expected.txt` under eval |
7273| `tools/clay-fixtures` | Syncs `my-app`, builds its example `/sur` files and marks through Clay, checks selected mold and mark projections and the partial checker, and records Ford and mark subject shapes on the fake ship |
7374| `tools/hoon` | Evaluates Hoon with the library in scope, as `tools/hoon '(golden /a/b/jibb (crip "++ main view"))'`; `--cord name=file` binds a file's text, `-f` reads the expression from a file |
@@ -92,6 +93,7 @@ tools/type-poke-test # source-backed poke/API bridge report matche
9293tools/type-api-paths-test # partial API path analysis report matches
9394tools/type-hole-guards-test # hole defaulting and API guards pass
9495tools/type-list-alias-test # prelude list-alias guards pass
96+tools/type-qath-guards-test # qath source and unfolding guards pass
9597tools/type-module-scope-test # module/prelude scope golden report matches
9698tools/hoon check-spans-test # prints <<>>
9799tools/hoon itype-unify-test # type-unification controls pass
docs/open-questions.md+3−1
@@ -18,7 +18,7 @@ On 2026-10-30, @iko adopted gate-free `eq` arguments and map and set keys, treat
1818
1919## Questions milestone 2 raises
2020
21−Found while writing [prompts/milestone-2.md](prompts/milestone-2.md), checking it against the doc's examples, and building the checker. The numbering is retained so existing references stay valid. Questions 3 and 18 remain open; the other questions are settled.
21+Found while writing [prompts/milestone-2.md](prompts/milestone-2.md), checking it against the doc's examples, and building the checker. The numbering is retained so existing references stay valid. Questions 3 and 18 remain open; the field-order detail in question 32 is being clarified. The other questions are settled.
2222
23231. **Settled: how the prelude identifies jetted functions.** On 2026-10-30, @iko said the prelude functions have working Jibb implementations, and the compiler recognizes their shapes and uses the Hoon versions so jets can fire.
24242. **Settled: how the prelude keeps helpers private.** On 2026-10-30, @iko chose a separate internal prelude module imported by the prelude, without exposing the imported helpers.
@@ -60,6 +60,8 @@ Found while writing [prompts/milestone-2.md](prompts/milestone-2.md), checking i
6060
616131. **Settled: uses of a value with a hole.** On 2026-10-31, @iko said a value definition must determine its own holes; another definition's use cannot fix an otherwise unresolved hole. For example, `++ id |= x=_ x` remains an error even if a later definition calls `id` with a cord.
6262
63+32. **Partly settled: type-directed record projection.** On 2026-10-31, @iko chose an explicit `(proj record)` whose expected result type selects the fields. There is no automatic projection, and `proj` is reserved against definitions and imports. The result contains exactly the fields of its expected type. Whether the result may reorder fields from the source remains open.
64+
6365## Grammar questions never put to the doc's author
6466
6567In milestone 1 the parser met about thirty places where the doc could be read more than one way. Twelve went to @iko on 2026-10-30 and are rows of the Decisions tab. These were not asked. For each, the parser follows the reading below, and some are marked "(doc question)" in the library's notes. None changes what a valid program means, except where a reading makes something an error.
docs/prelude-inventory.md+1−1
@@ -4,7 +4,7 @@ This is a working inventory, not a completed prelude interface. It lists top-lev
44
55The source is the fake ship's `%base` `/sys/hoon.hoon` (Hoon version 135), read through Clay with `tools/ship scry /cx/=base=/sys/hoon/hoon --raw`. SHA-256: `ef538ced0877230f02ff86f9fb7a0abc6833bb1cf0e8675742b4d6ce478fcc92`. It differs in bytes from [upstream Hoon at the inspected commit](https://github.com/urbit/urbit/blob/5a187fededc4582a34fcd6055c67bb63e0917b94/pkg/arvo/sys/hoon.hoon); verify against the actual target ship when updating this inventory.
66
7−The vendored prelude defines `poke` in its private internal module and re-exports it as a transparent type. The partial checker resolves its supported source shape and a narrow imported API constructor; complete checking of the private body, other API shapes, effect lowering and runtime execution remain unfinished. `ask` and `qath` are not yet defined there.
7+The vendored prelude defines `poke` in its private internal module and re-exports it as a transparent type. The partial checker resolves its supported source shape and a narrow imported API constructor; complete checking of the private body, other API shapes, effect lowering and runtime execution remain unfinished. `qath` is defined there as a transparent recursive knot sequence and re-exported by the public prelude; the partial checker supports its named identity, selected construction and matching, and static application-path literals. `ask` is not yet defined there.
88
99The prelude also declares the generic `cmd` mold exactly as in Overview, Effects. The partial checker infers its five cases and independent message types in the supported examples; complete module checking and backend validation remain outstanding. The related `sub` declaration awaits the source representation and checking of `ask`.
1010
docs/prompts/milestone-2.md+2−1
@@ -59,8 +59,9 @@ And from the plan's Risks:
5959The rules are scattered across the tabs. This is a map of them, not a replacement: read each in place, and where this summary and the doc differ, the doc is right.
6060
6161**Types and inference** (Grammar: Molds, Modules, Runes, Expressions; Decisions: Inference, Type variables, Sample names, Inline gates)
62−- Hindley–Milner with aura variables: "every expression has a principal type, and there is no general subtyping". A specific atom fits `@`, a specific noun fits `*`, and a more specific aura fits an ancestor in its Hoon aura family, each only in that direction; the reverse needs a check.
62+- Hindley–Milner with aura variables: "every expression has a principal type, and there is no general subtyping". A specific atom fits `@`, a specific noun fits `*`, and a more specific aura fits an ancestor in its Hoon aura family, each only in that direction; the reverse needs a check. Explicit `proj` is a type-directed operation.
6363- `@` means any atom, independently at each occurrence. A specific atom such as `@ud` fits where `@` is expected; an `@` value needs a check to fit `@ud`. `@ud` and `@ux` also fit `@u`, and `@tD` fits `@t`, following Hoon aura families; the reverse needs a check. Distinct specific auras remain distinct. `add` takes `[A A]` and returns `A`, with an atom constraint inferred for the shared type variable.
64+- The reserved, explicit `(proj record)` selects fields according to its expected result type. The checker records the projection and lowering evaluates the source once and builds that layout. A direct call does not insert a projection, and a module cannot define or import another `proj`.
6465- Faces are part of record types: `[a=@ b=@]` and `[x=@ y=@]` don't unify. An unnamed position can unify with a faced one and take its face, so `[0 0]` fits `[x=@ud y=@ud]`. A single-item cell `[a]` is `a`; an empty `[]` is an error.
6566- Type variables are capitals, "generalized per `++`". A capital in a local `++` shares the enclosing `++`'s variable of that name if the enclosing `++` also uses it; otherwise the local `++` introduces and generalizes its own variable. For example, `++ inner |= y=A y` shares `A` with an enclosing gate whose sample is `x=A`, but generalizes its own `A` if the enclosing `++` does not use `A`. A different type takes a different capital. A body cannot force two distinct capitals to be equal; use the same capital where a type is shared. "A type variable used where an atom is required gains an atom constraint", so `++ clamp |= [lo=A hi=A n=A]`, calling `gth` and `max`, works on any one aura; "It can become nothing more specific: a body that makes `A` a `@ud` or a list is an error." Names "may refer to each other in any order", so infer `++` definitions in dependency order, a group of mutually recursive ones together.
6667- The checker infers a gate-free constraint for `eq` arguments and map and set keys and retains it when a type variable is generalized. The requirement applies recursively to nested values; union-case matching treats gates as opaque. Print a gate-free constraint as `$-([A A] ?) where A contains no gates` and an atom constraint as `$-([A A] A) where A is an atom`; separate multiple clauses with commas, as `where A is an atom, B contains no gates`.
docs/spec/core-language.md+2−1
@@ -71,7 +71,7 @@ axis = digit { digit } ; (* at least 1 *)
7171
7272## Lowering from Jibb
7373
74−Types, faces and casts leave nothing behind; everything else lowers by these rules.
74+Types, faces and casts leave nothing behind. Everything else lowers by these rules.
7575
7676| Jibb | Core language |
7777| --- | --- |
@@ -82,6 +82,7 @@ Types, faces and casts leave nothing behind; everything else lowers by these rul
8282| `gap+%s2` | `(cons %gap %s2)` |
8383| `/posts/~zod`, `%/blog/(slug)` | A list of knots, typed segments printed by their aura's native; the runtime adds the base path to an application path |
8484| `title.p`, `space.theme.theme` | `slot` at the field's axis, nested for longer wings |
85+| `(proj record)` | Apply a `lam` to the source once; its body constructs the expected record from the required fields using `slot` and `cons`, discarding extra fields |
8586| `card.card`, an import | The qualified name `components/card:card` |
8687| `m(draft=t error=~)` | One `edit` per item, in order: `(edit 7 (edit 6 m t) ~)` |
8788| `f a b c` | `(app f (cons a (cons b c)))`: the arguments are the sample |
docs/spec/decisions.md+1
@@ -38,6 +38,7 @@ The choices behind the Language tab, made on 2026-10-23; a later date marks a re
3838| Derived gates | API files and stores give a constructor per poke type and a checked request per path or store state; clashing names are errors, including a derived name that clashes with an import face | Decided 2026-10-30 |
3939| Hoon types | A fixed translation table; `map`, `set`, `qeu`, `jar`, `jug` by name; `mop` as `(mop K V)`, read with `on`; imported `$%`, `$?` and `$^` cases must differ as nouns, and records with duplicate field names are errors where used; unused molds skipped | Decided 2026-10-30 |
4040| Record fields | Duplicate field names in a Jibb-written record are an error, as they are in an imported Hoon record | Decided 2026-10-31 |
41+| Record projection | The explicit type-directed operation `proj` takes a record and uses its expected result type to select its fields; no projection is inserted automatically. `proj` is reserved and cannot be defined or imported under that name. The result has exactly the fields declared by its type | Decided 2026-10-31 |
4142| Layout | Indentation; juxtaposed calls; a bracket open at line end takes one item per line, with no closer | Decided |
4243| Elements | Ordinary gates; containers take attribute lists; `stack` switches at `wide`; `el` adds attributes and wins; headings 1 to 6; `form` sends on Enter, the innermost when nested; `image` from an application path, sized from the file, or a sized URL; no focus control for now | Decided 2026-10-29 |
4344| Long calls | One argument per line inside parentheses | Decided |
docs/spec/grammar.md+2−2
@@ -118,12 +118,12 @@ Every other name is free.
118118
119119## Molds
120120
121−A mold is only a type: never called on a noun, and with no default. Types are inferred, Hindley–Milner with aura variables: every expression has a principal type, and there is no general subtyping. These one-way widenings are allowed: a value of a specific atom type fits `@`, a value of a specific noun type fits `*`, and a more specific aura fits an ancestor in its Hoon aura family; the reverse of each widening needs a check.
121+A mold is only a type: never called on a noun, and with no default. Types are inferred, Hindley–Milner with aura variables: every expression has a principal type, and there is no general subtyping. These one-way widenings are allowed: a value of a specific atom type fits `@`, a value of a specific noun type fits `*`, and a more specific aura fits an ancestor in its Hoon aura family; the reverse of each widening needs a check. Records can also be projected explicitly, as described below.
122122
123123- **Partial annotations**: `_` may appear wherever a mold may appear. It marks a part of the type for the checker to infer, so a type annotation can specify only the parts it needs to. A hole inferred to be a named type variable is resolved: in `++ id |= x=A ^- _ x`, the result hole is `A`. An unconstrained hole is an error. A named mold or value definition must determine its own holes: `+$ box [item=_]` and `++ id |= x=_ x` do not determine their holes, and later uses cannot fix them.
124124- **Atoms**: `@` is any atom, regardless of aura; auras such as `@ud`, `@t`, `@p` and `@da` are specific atom types. An `@ud` value fits where `@` is expected, but an `@` value needs a check to fit `@ud`. A more specific aura also fits an ancestor in its Hoon aura family: `@ud` and `@ux` fit `@u`, and `@tD` fits `@t`. The reverse needs a check. Distinct specific auras remain distinct; sharing an ancestor does not make them unify. Each bare `@` independently accepts any atom: it is not an aura variable. Atoms that must share a type take one capital, as `[lo=A hi=A]`, with the atom constraint inferred from the body. `add` takes `[A A]` and returns `A`, with `A` constrained to atoms, so `(add n 1)` with `n=@ud` is a `@ud`. Arithmetic rejects loobean operands: `?` contains only 0 and 1, while an arithmetic result need not. Comparison may take loobeans and returns `?`.
125125- **Constants**: `%add`, `~` and the loobeans have one value each.
126−- **Records and tuples**: `[text=@t done=?]`, `[@t ?]`. An empty `[]` is an error. Duplicate field names in a record are an error. Faces are part of the type, so `[a=@ b=@]` and `[x=@ y=@]` don't unify. An unnamed position can unify with a faced position and take its face, so `[0 0]` fits `[x=@ud y=@ud]`; two different faces don't unify. A record too long for one line can leave its `[` open, with one field per deeper line, as an expression's bracket does.
126+- **Records and tuples**: `[text=@t done=?]`, `[@t ?]`. An empty `[]` is an error. Duplicate field names in a record are an error. Faces are part of the type, so `[a=@ b=@]` and `[x=@ y=@]` don't unify. An unnamed position can unify with a faced position and take its face, so `[0 0]` fits `[x=@ud y=@ud]`; two different faces don't unify. The explicit type-directed operation `(proj record)` selects fields from its argument according to the expected result type: `^- [x=@ud y=@ud] (proj wider)`, or `(f (proj wider))` when `f` expects that record. The source is evaluated once, and the result contains exactly the fields in the expected layout. No projection is inserted for a direct call. `proj` is reserved: a module cannot define or import another name `proj`. A record too long for one line can leave its `[` open, with one field per deeper line, as an expression's bracket does.
127127- **Unions**: a `+$` with several cases below it. Every union written in Jibb has a name, so one used in a field, a sample, a cast, a gate's mold or an argument gets its own `+$`; only imports bring in unions without one. Tags take their union from context, as Tag resolution describes. Cases must differ as nouns: inhabited cases must differ at some position of their right-nested cells, where one is an atom and the other a cell, or both are different constants. `*`, type variables and molds that can be either, such as `(list A)`, can overlap atoms and cells. `?` counts as the two atoms `%.y` and `%.n`: it is disjoint from cells and overlaps the constants 0 and 1. The empty mold `!!` is disjoint from every case; a cell with an empty position at any depth is itself empty and is also disjoint from every case. A union whose cases don't all differ is rejected.
128128- **Containers**: `(list A)`, `(unit A)`, `(set A)`, `(map K V)`, `(mop K V)`, `(qeu A)`, `(jar K V)`, `(jug K V)`.
129129- **Gates**: `$-(A B)`. Type variables are capitals, generalized per `++`. A capital in a local `++` shares the enclosing `++`'s variable of the same name if the enclosing `++` also uses it; otherwise the local `++` introduces and generalizes its own variable. For example, `++ inner |= y=A y` uses the enclosing `A` when its enclosing gate has a sample `x=A`; if the enclosing `++` does not use `A`, `inner` generalizes its own `A`. Use another capital for a different type. A body can't force two distinct capitals to be equal; use the same capital wherever a type must be shared. A type variable used where an atom is required gains an atom constraint, so `++ clamp |= [lo=A hi=A n=A]`, whose body calls `gth` and `max`, works on any one aura. It can become nothing more specific: a body that makes `A` a `@ud` or a list is an error.
docs/status.md+12−6
@@ -19,7 +19,11 @@ On 2026-10-30, @iko decided that Jibb drops `$?`, so a `+$` takes a union's case
1919
2020## Milestone 2: in progress
2121
22−The parser accepts `_` in mold positions and typed path segments, retaining each hole’s span. The partial checker tracks ordinary annotation holes through inference and requires each value or local definition to resolve its own holes before generalization. A hole can resolve to a concrete type or an explicitly written in-scope type variable; later uses cannot fix an unresolved definition. Independent decimal holes can default, but captured variables are not defaulted prematurely. Structural named molds with an unresolved hole report its site. Complex mold forms, inferred path segments, mutual recursive groups and other unsupported constraints still fail closed, and the fragment does not claim the module is checked. A syntax-tree pass rejects duplicate field names within each written record and reports both sites. The repository spec now records that `ask` and `qath` are transparent; their prelude implementations are still outstanding.
22+The parser accepts `_` in mold positions and typed path segments, retaining each hole’s span. The partial checker tracks ordinary annotation holes through inference and requires each value or local definition to resolve its own holes before generalization. A hole can resolve to a concrete type or an explicitly written in-scope type variable; later uses cannot fix an unresolved definition. Independent decimal holes can default, but captured variables are not defaulted prematurely. Structural named molds with an unresolved hole report its site. Complex mold forms, inferred path segments, mutual recursive groups and other unsupported constraints still fail closed, and the fragment does not claim the module is checked. A syntax-tree pass rejects duplicate field names within each written record and reports both sites. The repository spec now records that `ask` and `qath` are transparent; `ask` remains outstanding.
23+
24+On 2026-10-31, @iko chose explicit, result-directed `(proj record)` to construct a record with exactly the expected fields, and reserved `proj` against definitions and imports. The repository spec records this change; projection-aware type checking and lowering are not implemented yet.
25+
26+The internal prelude also defines `qath` as a transparent recursive knot sequence, re-exported by the public prelude. The partial checker recognizes its source identity, supports selected null/cell construction and matching, and types static application-path literals. Other recursive shapes, broader patterns and dynamic application-path segments remain unsupported. A 256-step limit applies per inference attempt, not to parsing or retries; checking routes and static files remains milestone 4. `ask` is still unfinished.
2327
2428The repository spec records the subsequent type-system and prelude decisions; those changes also need synchronization to the Claude document. An initial inference fragment and a standalone Hoon type reader are being tested. The fragment explicitly reports that it does not check a module; partial bridges pass Hoon `*` in supported nonrecursive molds, selected Hoon atoms, term singletons, the null singleton, the two loobean singletons and their exact fork, nested faced or unfaced cells, supported disjoint unions and opaque standard collections from `/sur` molds and marks into inference. Collections retain their names and supported arguments for printing and unification; nested supported union arguments are retained too. The bridge trusts unchanged results from the source-aware reader; a materialized type graph alone cannot reveal cases Hoon already collapsed. The source-validated standard prelude `list` mold shares this representation with imported lists; other Jibb-written collection molds and most prelude collection operations remain unsupported; malformed names and arities fail closed. Selected self-recursive `/sur` molds, including Tlon `notes.import-node` with list-wrapped self references, cross as opaque module-and-name identities; aliases, foreign references, recursive marks, unfolding and construction remain unsupported. The reader handles mark samples, including a source-proved nonrecursive union from a single Ford-imported `/sur` core, recursive molds whose origins can be verified through Ford imports, nested collections, direct ordered maps, including source-validated named operands such as Tlon `notes.log`, certain ordered-map fields, direct `$^` unions whose cases can be proved disjoint, and one verified explicit union argument in a list, set, map or unit. Tagged `$%` cases can additionally use restricted local named payload molds, bare `~` fields and one level of local named tagged unions, as in real Tlon `notes`, with bounded source proof; unsupported or ambiguous dependencies fail closed. Ambiguous recursive origins fail closed; recognizable explicit unions are checked from source before Hoon can collapse their cases, as @iko confirmed for imported `$%`, `$?` and `$^`, while other nested unions, nested ordered maps, general union disjointness and complete import integration remain unfinished. Opt-in structured reader APIs preserve successful graphs and distinguish definite unsupported-aura and core evidence from failures the reader cannot prove; unverified union disjointness and name-only vase recognition remain unsupported. They revalidate and re-walk failed types. An opt-in partial checker entry point consumes unchanged reader results and reports definite aura or core errors at imported mold use sites when their inputs are unique. Ordered replay covers nested cell samples, record and function casts, and non-generic same-module aliases; unsupported prefixes, cycles and shadowing stop it. Union molds, generic applications, transitive modules and unsupported reader outcomes remain generic. Replay repeats inference and may add work. The partial checker resolves a subset of ordinary library imports in dependency order using supplied Jibb sources and a source-derived partial prelude interface, caches completed interfaces per run, detects missing sources and cycles, and resolves nested fields of imported values with independent scheme instantiation. The source-backed internal prelude defines `poke` and the public prelude re-exports it as a transparent type. A dedicated trusted preparation path supplies a private comparison scheme to the Jibb-written `gth` wrapper; ordinary imports cannot access them. Primitive execution and jet recognition are unfinished, and addition, decrement and length remain unavailable until arithmetic constraints distinguish their results from loobeans. The partial checker resolves its supported source shape and rejects ordinary imports of the private path. An imported API with one mark and a matching direct `+$ poke` declaration can export a constructor and retain agent/mark metadata when the representation has the supported agent case. A separate partial analysis resolves supported API path declarations and their full and diff mark types, including the todo paths; it does not create requests or check an API module. Complete private module checking, other API shapes, request gates, root API and kind checking, stores, `ask`, `pure`, lowering and runtime effects remain unfinished. A possible store or root API with `+$ poke` reports unsupported kind or scope, while definite duplicates and unrelated shadowing still report conflicts. The prelude includes the doc-exact generic `cmd` union; the prelude inventory is incomplete. The inference fragment supports unrestricted `@`, selected one-way widenings including aura-family ancestors, generalized atom constraints arising from explicit capitals or bare sample binders, acyclic local value definitions with captures, selected single self-recursive top-level and local gates, simple and nonrecursive generic mold aliases, selected faced record casts and field reads, and contextual tags, `~` and constructors for closed disjoint unions, including direct nonrecursive generic unions and propagation through complete loobean and unit-shaped branches in casts and known union-sample calls, including nested branches. Known loobean result context also propagates through supported complete branches and binder-only cell arms; binder-only arms over union subjects remain unsupported. A directly known named union can instantiate an unconstrained generic gate sample with its origin, generic arguments and faces preserved; unnamed, pending, recursive and variable-bound cases remain unsupported. A known gate with an unresolved result variable can receive a known enclosing result type before its arguments are inferred; unknown calls and unresolved targets remain conservative. Multi-argument calls form a right-nested sample, retain known faces and shared type variables, and can use known sample positions to contextualize list and union arguments. A definite mismatch points to the failing argument when the fragment can establish it, otherwise to the combined sample; unsupported contextual forms still fail closed. For a supported recursive gate, the checker infers the sample first and uses its exact type, including field faces, for one monomorphic self reference. It generalizes after the body is checked; subsequent uses instantiate it independently. Incompatible recursive arguments can report the gate and argument sites. For a complete loobean branch with one direct self-call arm, a separately inferred closed base type can seed the recursive result before the whole body is checked. Open or pending base types do not seed it; other branch shapes remain subject to the fragment’s existing limits. A supported single local recursive gate also uses a monomorphic self reference and generalizes variables free of the enclosing environment after checking its body; captured variables remain shared. The checker collects written capitals per `++` before inference, excluding nested definitions: a capital used in an enclosing definition is shared with its locals even when written later, while a capital introduced only in a local definition is generalized there. Sibling locals can introduce independent capitals with the same spelling; generic mold parameters keep their own scope. Top-level groups of syntactic gates are inferred together with monomorphic placeholders and shared substitutions, then generalized only after the whole group checks; downstream uses and library interfaces instantiate those schemes independently. A dependency graph identifies groups with two iterative depth-first passes; its conservative local-reference edges can reject otherwise valid programs. Supported local mutually recursive gate groups also use shared monomorphic placeholders and generalize only after the group checks, preserving captured outer variables. A bounded dependency proof reports certain non-gate cycles through values and gates when an explicit atom or loobean result cast and simple unshadowed expressions establish the cycle. Other mixed gate/value cycles, polymorphic recursion, unresolved literal constraints and unresolved branch joins remain unsupported. Reporting repeats inference for a single recursive gate outside a group; grouped reports use the stored schemes. Its performance cost remains unmeasured. A single-arm cell pattern accepts two or more binders, the last capturing the remaining tail; duplicate and shadowed binders are rejected. A structured single-arm pattern also works for a known non-union cell when coverage is proven, including nested literal and wildcard positions. Intermediate union or collection tails, nested patterns, wildcards and faced records remain unsupported. String interpolation accepts known atom auras, unrestricted `@`, tapes and isolated decimal literals; a known cell asks for a printer, and an explicitly generic atom asks for an aura. Loobeans, term singletons, non-tape collections, open types and a type fixed only later remain unsupported. A known closed union with two or more arms supports patterns that provably cover or exclude each remaining case, including payload binders, imported and generic cases, and binder-free catch-alls. Partial boolean patterns can split known `?` positions into their two noun values, up to 64 alternatives across the union; binders retain their original case type. Missing alternatives and covered arms are reported. Other partial patterns, expansions above the limit, binders spanning distinct cases, differing arm result types and some complex two-arm subjects remain unsupported. A cast or known call sample can supply result context through whole-case arms and supported finite loobean refinements for a known union accessed by a wing, a grouped wing or a supported shallow call, including nested cell and list positions; other partial-pattern contexts and subject forms remain unsupported. The Grammar’s `step` block infers in this fragment, but its module is not yet checked. A bare tag proved absent from a known union reports the union and tag sites in casts, single-argument calls, unit payloads, list items and supported branch arms; imported unnamed unions print their cases. Ordered fit replay can identify a missing tag nested in a syntactic tuple, stopping at an earlier mismatch or uncertainty. Known faced records support uniquely named field changes, including nested wings, with field context passed to replacements and the original record type retained. Missing fields, empty changes and definite mismatches report sites; the expected-type site is the edit because the original field declaration location is not retained. Unknown or partly unfaced spines, ambiguous fields and repeated edits remain unsupported. A known record cast supplies field context to its tuple or record initializer, including nested list and union fields; mismatch diagnostics use the cast mold because the original field declaration location is not retained. Isolated cart-style `init` and `update` expressions infer, while the complete cart-store fails closed because its kind and declaration scope remain unchecked. Uncontextualized list literals infer a fresh element type, including empty and nested lists, with independently generalized uses. Unresolved item tags and uncertain widening remain unsupported. Backtick unit construction uses the validated standard prelude unit template, infers its payload without losing pending constraints, and makes the prelude’s `some` available. Ordinary result annotations also let its `bind`, `biff`, `both`, `clap`, `clef` and `flit` infer. A known unit in a cast, call, list item or record field supplies context to its payload, including nested units and lists; mismatches identify the payload and context. Unrelated union identities, some variable-dependent fits, and missing or altered prelude unit templates remain unsupported. Contextual null-headed cells fit their cases, but do not supply a `|=%$` constructor; unresolved nulls remain pending and are reported separately from tags. A known union of `~` and a null-headed cell supports a complete `~` / `[~ value]` branch in either order, including shadow checks; unknown subjects, missing or duplicate arms, and unresolved branch results remain unsupported. This fragment infers the prelude’s `fall` and `need` signatures. With the validated prelude list and a known cast or gate sample, empty, nonempty and nested list literals infer their element types, including contextual union tags; a mismatched element names both sites. In that context `~` and zero-valued terms fit an empty list, and two-item unfaced cells form cons lists, including nested cons and imported-list contexts; invalid heads or tails name both sites. A known gate sample also supplies context to matching positions in a single tuple or record argument, including nested cells; zero literals can fit list positions. A bound zero constant remains unsupported rather than a definite mismatch, and an unknown callee does not supply context. Faced or longer cells and a missing or altered prelude list fail closed. A known list result also supplies context through complete loobean, unit-shaped and list-shaped branches, including recursive and nested branches. For a known standard list with a supported element type, a complete `~` / `[item rest]` branch infers the element and tail types in either arm order and checks binders for shadowing. Unknown subjects, unsupported element types and other or incomplete list patterns remain unsupported. A value with type variable `A` can fit a field whose type is that same `A`, including in generic union payloads and nested or repeated record fields. Other variable-dependent face merges remain unsupported. Forced equality of distinct written capitals now reports both source sites, following @iko’s decision; forcing one to a concrete type remains unsupported. Imported record spines with repeated faces fail closed where used, but only with a generic unsupported diagnostic. Hoon may erase unfaced nested-cell boundaries, so the check can conservatively reject valid names in distinct erased scopes. Supported closed unions print using an in-scope name or imported alias; an unnamed nongeneric union prints its cases, parenthesized when nested. The latter is print-only. Generic union types retain all arguments in their printed name; if that name is unavailable, the partial printer reports the limitation. Different import faces for the same origin remain compatible; compatibility across distinct union origins and some generic-argument comparisons remain unsupported. Nonrecursive generic aliases can reorder, repeat or omit parameters while retaining a union’s origin, including through local scopes and library interfaces. A generic union declared directly inside a body remains unsupported, as do differing-variable face constraints in a union payload. A transitive generic union whose name is unavailable is reported as unsupported instead of hiding its arguments. Unfixed decimal literals default to `@ud` in gate-free inferred types; recursive molds, general branch tag context, other constraint cases and defaulting inside gate types still need work. Collection recognition checks the originating core and fails closed on shadows or unsupported Ford subject shapes; a wrapper regression also rejects forged subjects, samples and tails. Its golden fixtures include three real Tlon files. A Clay test passes a Ford-built nested union through the reader into partial inference. The partial prelude includes `murn`, `join`, `snip`, `rear` and the newly agreed shared-type `clap`, parsed but still awaiting checker and backend validation, and [prelude-inventory.md](prelude-inventory.md) is a source audit, not the complete inventory or signatures. The milestone remains unfinished.
2529
@@ -41,8 +45,8 @@ What the plan asks for, and where it is:
4145
4246Besides the plan's list:
4347
44−- 604 golden cases: 384 that parse and 220 that fail, each failure at a stated line and column. One failing case has an unclear expectation (corpus question 3). The newer type-output cases exercise only the partial inference fragment. Each case's `about.txt` quotes the doc's words it tests.
45−- The 604-case corpus passed under `urbit eval` in 81.0 s while other checks were running. The fake ship passed all 615 tests, including the importer, importer/checker and mark/checker bridges, module scope, unification and hole guards, with 51.3 s for sync and 49.4 s for tests. The importer golden compares 221 projections; `tools/clay-fixtures` builds the example Hoon fixtures through Clay, checks a recursive Ford import's origin, and passes Clay-built types through the Clay-built importer and partial checker.
48+- 608 golden cases: 388 that parse and 220 that fail, each failure at a stated line and column. One failing case has an unclear expectation (corpus question 3). The newer type-output cases exercise only the partial inference fragment. Each case's `about.txt` quotes the doc's words it tests.
49+- The 608-case corpus passed under `urbit eval` in 80.7 s while other checks were running. The fake ship passed all 621 tests, including the importer, importer/checker and mark/checker bridges, module scope, unification, hole and qath guards, with 49.9 s for sync and 65.2 s for tests. The importer golden compares 221 projections; `tools/clay-fixtures` builds the example Hoon fixtures through Clay, checks a recursive Ford import's origin, and passes Clay-built types through the Clay-built importer and partial checker.
4650- `tools/testdata/selftest` (22 checks), `tools/testdata/ship-selftest` and `tools/testdata/clay-fixtures-selftest` test the tools themselves; the last checks temporary Clay fixture cleanup and signal handling without a ship.
4751- Two independent audits before 7c739b7, one of which compared the library with a reference parser written in Python from the doc over about 19,000 generated programs. Before ab797a9, a second Python parser, written from the decisions, agreed with the library on 8,000 generated programs and 900 hand-written probes.
4852- Speed: starting `urbit eval` and building the library takes about 8 s. After that, a 2,000-line module of 400 definitions parses in about a second. Loops over definitions, arms, lines and items grow no stack; nesting costs a few stack frames a level, and 100,000 nested brackets still parse (library section 3).
@@ -122,14 +126,15 @@ Besides the plan's list:
122126| 4e472b5 | 2026-10-31 | Pass known named unions through polymorphic gates |
123127| e3e184f | 2026-10-31 | Parse type holes, reject duplicate written record fields, and extend partial union inference and imports |
124128| 80e221a | 2026-10-31 | Infer supported annotation holes and prelude list aliases |
125−| This change | 2026-10-31 | Add the curried `bond` prelude gate |
129+| ba1fec4 | 2026-10-31 | Add the curried `bond` prelude gate |
130+| This change | 2026-10-31 | Infer a source-defined recursive `qath` subset and record the explicit `proj` decision |
126131
127132## Checking it
128133
129134On a machine set up as [development.md](development.md) says:
130135
131136```
132−tools/golden # 604 cases under urbit eval
137+tools/golden # 608 cases under urbit eval
133138tools/importer-test # the Hoon importer fixture projection
134139tools/type-import-test # the importer/checker bridge fixture
135140tools/type-tlon-test # the real Tlon reader/checker fixture
@@ -138,13 +143,14 @@ tools/type-poke-test # the source-backed poke/API fixture
138143tools/type-api-paths-test # partial API path metadata fixture
139144tools/type-hole-guards-test # hole defaulting and API interface guards
140145tools/type-list-alias-test # prelude list-alias guards
146+tools/type-qath-guards-test # qath source and unfolding guards
141147tools/type-module-scope-test # module and prelude scope fixture
142148tools/hoon check-spans-test # prints <<>> when the span checker works
143149tools/testdata/selftest # the tools themselves
144150tools/doc-blocks docs/spec # the doc's examples are golden cases
145151tools/ship start
146152tools/ship gen-tests --check # tests/lib/jibb.hoon is up to date
147−tools/ship test # the same 604 cases as -test arms on the ship
153+tools/ship test # the same 608 cases as -test arms on the ship
148154tools/testdata/ship-selftest
149155tools/testdata/clay-fixtures-selftest # scratch fixture cleanup without a ship
150156tools/ship check-commit # |commit stores .jibb files
jibb-dev/lib/jibb.hoon+159−9
@@ -4627,6 +4627,7 @@
46274627 [%const literal=lit]
46284628 [%collection name=term args=(list itype)]
46294629 [%recursive module=term name=term label=(unit @t)]
4630+ [%jrec at=path name=term label=(unit @t) head=term aura=@ta tail=term]
46304631 [%union cases=(list itype) origin=(unit [at=path name=term]) label=(unit @t) args=(list itype)]
46314632 [%face name=term body=itype]
46324633 [%fn sample=itype product=itype]
@@ -4681,6 +4682,7 @@
46814682 %const |
46824683 %union |((lien cases.t |=(c=itype (itype-occurs n c sub))) (lien args.t |=(c=itype (itype-occurs n c sub))))
46834684 %recursive |
4685+ %jrec |
46844686 %collection (lien args.t |=(c=itype (itype-occurs n c sub)))
46854687 %face $(t body.t)
46864688 %fn |($(t sample.t) $(t product.t))
@@ -4699,6 +4701,8 @@
46994701 =. a (itype-walk a sub)
47004702 =. b (itype-walk b sub)
47014703 ?: =(a b) `sub
4704+ ?: &(?=(%jrec -.a) ?=(%jrec -.b))
4705+ ?:(&(=(at.a at.b) =(name.a name.b) =(head.a head.b) =(aura.a aura.b) =(tail.a tail.b)) `sub ~)
47024706 ?: &(?=(%recursive -.a) ?=(%recursive -.b))
47034707 ?:(&(=(module.a module.b) =(name.a name.b)) `sub ~)
47044708 ?: &(?=(%union -.a) ?=(%union -.b))
@@ -4778,6 +4782,7 @@
47784782 %const |
47794783 %union |((lien cases.t |=(c=itype (itype-has-any-atom c sub))) (lien args.t |=(c=itype (itype-has-any-atom c sub))))
47804784 %recursive |
4785+ %jrec |
47814786 %collection (lien args.t |=(c=itype (itype-has-any-atom c sub)))
47824787 %face $(t body.t)
47834788 %fn |($(t sample.t) $(t product.t))
@@ -4849,6 +4854,7 @@
48494854 %const &
48504855 %union |((lien cases.typ |=(c=itype (itype-has-fixed-atom c))) (lien args.typ |=(c=itype (itype-has-fixed-atom c))))
48514856 %recursive |
4857+ %jrec |
48524858 %collection (lien args.typ |=(c=itype (itype-has-fixed-atom c)))
48534859 %face $(typ body.typ)
48544860 %fn |($(typ sample.typ) $(typ product.typ))
@@ -4934,6 +4940,7 @@
49344940 %cell &
49354941 %union &
49364942 %recursive &
4943+ %jrec &
49374944 %noun &
49384945 %collection &
49394946 %face $(t body.t)
@@ -5006,6 +5013,7 @@
50065013 ^- ?
50075014 ?- -.t
50085015 %recursive &
5016+ %jrec &
50095017 %collection (lien args.t |=(c=itype (itype-has-recursive c)))
50105018 %union (lien (weld args.t cases.t) |=(c=itype (itype-has-recursive c)))
50115019 %face $(t body.t)
@@ -5019,6 +5027,7 @@
50195027 ^- ?
50205028 ?- -.t
50215029 %recursive ?=(~ label.t)
5030+ %jrec ?=(~ label.t)
50225031 %collection (lien args.t |=(c=itype (itype-has-hidden-recursive c)))
50235032 %union (lien (weld args.t cases.t) |=(c=itype (itype-has-hidden-recursive c)))
50245033 %face $(t body.t)
@@ -5085,6 +5094,11 @@
50855094 [%ok sub next]
50865095 :: An arbitrary noun is not known to fit a narrower type.
50875096 ?: &(?=(%noun -.actual) !?=(%var -.expected)) [%unknown ~]
5097+ ?: &(!uncertain ?=(%jrec -.actual) ?=(%face -.expected)) $(expected body.expected)
5098+ ?: &(!uncertain ?=(%face -.actual) ?=(%jrec -.expected)) $(actual body.actual)
5099+ ?: &(?=(%jrec -.actual) ?=(%jrec -.expected))
5100+ ?:(&(=(at.actual at.expected) =(name.actual name.expected) =(head.actual head.expected) =(aura.actual aura.expected) =(tail.actual tail.expected)) [%ok sub next] [%bad ~])
5101+ ?: &(|(?=(%jrec -.actual) ?=(%jrec -.expected)) !|(?=(%var -.actual) ?=(%var -.expected))) [%unknown ~]
50885102 ?: &(?=(%recursive -.actual) ?=(%recursive -.expected))
50895103 ?:(&(=(module.actual module.expected) =(name.actual name.expected)) [%ok sub next] [%bad ~])
50905104 ?: &(|(?=(%recursive -.actual) ?=(%recursive -.expected)) !|(?=(%var -.actual) ?=(%var -.expected))) [%unknown ~]
@@ -5295,7 +5309,10 @@
52955309:: Hole obligations survive discarded expressions until their owning
52965310:: definition has inferred; their source spans support unresolved reports.
52975311+$ ihole [id=@ud at=span]
5298−+$ istate [next=@ud sub=isub caps=icaps binders=(list @ud) molds=imolds globals=(list term) externals=iexternals surs=(list term) mark-externals=imark-externals marks=(list term) jimports=ijimports reserved-molds=(list term) params=iparams active=(list term) tags=(list ipending) in-mold=? at=path top-molds=(list term) prelude=(unit ifile) holes=(list ihole)]
5312+:: Recursive-mold unfolding spends fuel in the threaded inference state.
5313+:: Retries can restart from an earlier state, so this bounds an attempt,
5314+:: not all parsing or module-checking work.
5315++$ istate [next=@ud sub=isub caps=icaps binders=(list @ud) molds=imolds globals=(list term) externals=iexternals surs=(list term) mark-externals=imark-externals marks=(list term) jimports=ijimports reserved-molds=(list term) params=iparams active=(list term) tags=(list ipending) in-mold=? at=path top-molds=(list term) prelude=(unit ifile) holes=(list ihole) jrec-fuel=@ud]
52995316+$ idiag [msg=tape sites=(list [at=span note=tape])]
53005317+$ iresult (each [typ=itype state=istate] idiag)
53015318+$ isample-result (each [typ=itype env=ienv state=istate] tape)
@@ -5340,6 +5357,7 @@
53405357 %fn &
53415358 %cell |($(t hed.t) $(t tal.t))
53425359 %recursive |
5360+ %jrec |
53435361 %collection (lien args.t |=(c=itype (itype-has-gate c)))
53445362 %face $(t body.t)
53455363 %union (lien cases.t |=(c=itype (itype-has-gate c)))
@@ -5465,6 +5483,7 @@
54655483 %const ~
54665484 %union (zing (turn (weld args.t cases.t) |=(c=itype (itype-vars c))))
54675485 %recursive ~
5486+ %jrec ~
54685487 %collection (zing (turn args.t |=(c=itype (itype-vars c))))
54695488 %face $(t body.t)
54705489 %fn (weld $(t sample.t) $(t product.t))
@@ -5504,6 +5523,7 @@
55045523 %const t
55055524 %union [%union (turn cases.t |=(c=itype (itype-rename c ren))) origin.t label.t (turn args.t |=(c=itype (itype-rename c ren)))]
55065525 %recursive t
5526+ %jrec t
55075527 %collection [%collection name.t (turn args.t |=(c=itype (itype-rename c ren)))]
55085528 %face [%face name.t $(t body.t)]
55095529 %fn [%fn $(t sample.t) $(t product.t)]
@@ -5528,6 +5548,7 @@
55285548 %const |
55295549 %union |((lien cases.t |=(c=itype (itype-var-is-atom n c))) (lien args.t |=(c=itype (itype-var-is-atom n c))))
55305550 %recursive |
5551+ %jrec |
55315552 %collection (lien args.t |=(c=itype (itype-var-is-atom n c)))
55325553 %face $(t body.t)
55335554 %fn |($(t sample.t) $(t product.t))
@@ -5935,6 +5956,14 @@
59355956:: Names exported by the directly imported module are visible through its
59365957:: face; a matching prelude alias is also visible without a qualifier.
59375958::
5959+++ jrec-alias
5960+ |= [origin=path name=term molds=imold-types]
5961+ ^- (unit term)
5962+ ?~ molds ~
5963+ =/ template=ischeme template.i.molds
5964+ ?: &(?=(~ vars.template) ?=(%jrec -.typ.template) =(at.typ.template origin) =(name.typ.template name)) `name.i.molds
5965+ $(molds t.molds)
5966+::
59385967++ itype-in-import
59395968 |= [t=itype iface=ifile face=term prelude=(unit ifile)]
59405969 ^- itype
@@ -5954,6 +5983,12 @@
59545983 `(crip "{(trip u.alias)}.{(trip face)}")
59555984 [%union (turn cases.t |=(c=itype (itype-in-import c iface face prelude))) origin.t label (turn args.t |=(c=itype (itype-in-import c iface face prelude)))]
59565985 %recursive [%recursive module.t name.t ~]
5986+ %jrec
5987+ =/ public=(unit term) ?~(prelude ~ (jrec-alias at.t name.t molds.u.prelude))
5988+ ?^ public t(label `u.public)
5989+ =/ alias=(unit term) (jrec-alias at.t name.t molds.iface)
5990+ ?~ alias t(label ~)
5991+ t(label `(crip "{(trip u.alias)}.{(trip face)}"))
59575992 %collection [%collection name.t (turn args.t |=(c=itype (itype-in-import c iface face prelude)))]
59585993 %face [%face name.t $(t body.t)]
59595994 %fn [%fn $(t sample.t) $(t product.t)]
@@ -6027,9 +6062,46 @@
60276062 =/ rest=[params=iparams vars=(list @ud) next=@ud] $(names t.names, next +(next))
60286063 [[[i.names [%var next]] params.rest] [next vars.rest] next.rest]
60296064::
6065+:: Recognize a unique top-level source mold with exactly a null case and a
6066+:: faced atom-headed cell whose faced tail names that same mold. Its Jibb
6067+:: path and name provide nominal identity. Other recursive shapes fail closed;
6068+:: construction and matching expose the proven shape one layer at a time.
6069+++ simple-source-recursive
6070+ |= [name=term sh=shape state=istate]
6071+ ^- (unit itype)
6072+ ?. (lien top-molds.state |=(n=term =(n name))) ~
6073+ =/ original=(unit shape) (find-simple-mold name molds.state)
6074+ ?~ original ~
6075+ ?. =(u.original sh) ~
6076+ ?. ?=(%union -.sh) ~
6077+ =/ cs=(list shape) cases.sh
6078+ ?~ cs ~
6079+ ?~ t.cs ~
6080+ ?^ t.t.cs ~
6081+ ?. ?=(%const -.i.cs) ~
6082+ ?. =(%null form.lit.i.cs) ~
6083+ ?. ?=(%cell -.i.t.cs) ~
6084+ =/ fs=(list field) fields.i.t.cs
6085+ ?~ fs ~
6086+ ?~ t.fs ~
6087+ ?^ t.t.fs ~
6088+ ?. ?=(%face -.i.fs) ~
6089+ ?. ?=(%aura -.shape.i.fs) ~
6090+ ?. !=(0 aura.shape.i.fs) ~
6091+ ?. ?=(%face -.i.t.fs) ~
6092+ ?. !=(name.i.fs name.i.t.fs) ~
6093+ =/ tail=shape shape.i.t.fs
6094+ ?. ?=(%ref -.tail) ~
6095+ ?. =(names.tail ~[name]) ~
6096+ `[%jrec at.state name `name name.i.fs aura.shape.i.fs name.i.t.fs]
6097+::
60306098++ infer-mold-template
60316099 |= [sh=shape state=istate]
60326100 ^- (unit [template=ischeme state=istate])
6101+ =/ direct=(unit itype)
6102+ ?. ?=([@ ~] active.state) ~
6103+ (simple-source-recursive i.active.state sh state)
6104+ ?^ direct `[[u.direct ~] state]
60336105 ?: ?=(%generic -.sh)
60346106 ?~ vars.sh ~
60356107 ?. (distinct-params vars.sh) ~
@@ -6203,6 +6275,8 @@
62036275 ?~ prelude-entry ~
62046276 ?^ vars.u.prelude-entry ~
62056277 `[typ.u.prelude-entry state]
6278+ =/ direct=(unit itype) (simple-source-recursive n u.found state)
6279+ ?^ direct `[u.direct state]
62066280 =/ out=(unit [typ=itype state=istate])
62076281 $(sh u.found, state state(active [n active.state], in-mold &, params ~))
62086282 ?~ out ~
@@ -7261,9 +7335,40 @@
72617335 [%| ["single-case branch result needs context in partial inference" ~]]
72627336 [%& typ.u.expected state.p.body(sub sub.fit, next next.fit)]
72637337::
7338+:: This view is used only by pattern analysis, never exported or bound as
7339+:: the subject. Only null plus a two-binder/wildcard cell is supported; its
7340+:: tail keeps the original recursive type. Other patterns fail closed.
7341+++ jrec-match-view
7342+ |= [e=expr subject=iresult]
7343+ ^- iresult
7344+ ?: ?=(%| -.subject) subject
7345+ ?. ?=(%branch -.e) subject
7346+ =/ typ=itype (itype-normalize typ.p.subject sub.state.p.subject)
7347+ ?. ?=(%jrec -.typ) subject
7348+ ?~ arms.e subject
7349+ ?~ t.arms.e subject
7350+ ?^ t.t.arms.e subject
7351+ =/ x=pattern pat.i.arms.e
7352+ =/ y=pattern pat.i.t.arms.e
7353+ =/ empty=? &(?=(%lit -.x) =(%null form.lit.x))
7354+ =/ full=pattern ?:(empty y x)
7355+ ?. |(empty &(?=(%lit -.y) =(%null form.lit.y))) subject
7356+ ?. ?=(%cell -.full) subject
7357+ ?~ items.full subject
7358+ ?~ t.items.full subject
7359+ ?^ t.t.items.full subject
7360+ ?. |(?=(%bind -.i.items.full) ?=(%any -.i.items.full)) subject
7361+ ?. |(?=(%bind -.i.t.items.full) ?=(%any -.i.t.items.full)) subject
7362+ ?: =(0 jrec-fuel.state.p.subject)
7363+ [%| ["recursive mold unfolding needs unsupported inference" ~]]
7364+ =/ nil=itype [%const [%null %n 0 '~']]
7365+ =/ cell=itype [%cell [%face head.typ [%atom aura.typ]] [%face tail.typ typ]]
7366+ [%& [%union ~[nil cell] ~ ~ ~] state.p.subject(jrec-fuel (dec jrec-fuel.state.p.subject))]
7367+::
72647368++ infer-known-union-branch-subject
72657369 |= [e=expr env=ienv subject=iresult]
72667370 ^- iresult
7371+ =. subject (jrec-match-view e subject)
72677372 =/ whole=(unit iresult) (infer-known-union-whole e env subject)
72687373 ?~ whole (infer-known-union-finite e env subject ~)
72697374 u.whole
@@ -7277,6 +7382,7 @@
72777382++ infer-known-union-context-subject
72787383 |= [e=expr expected=itype env=ienv subject=iresult context=span]
72797384 ^- iresult
7385+ =. subject (jrec-match-view e subject)
72807386 =/ whole=(unit iresult) (infer-known-union-context-whole e expected env subject context)
72817387 ?~ whole (infer-known-union-finite e env subject `[expected context])
72827388 u.whole
@@ -7328,7 +7434,7 @@
73287434 =/ subject=iresult (infer-fragment e env state)
73297435 ?: ?=(%| -.subject) ?:((union-subject-call e) `subject ~)
73307436 =/ typ=itype (itype-normalize typ.p.subject sub.state.p.subject)
7331− ?. ?=(%union -.typ) ~
7437+ ?. |(?=(%union -.typ) ?=(%jrec -.typ)) ~
73327438 `subject
73337439::
73347440::
@@ -7478,6 +7584,15 @@
74787584 =/ head=expr [%lit at.e [%term %tas tag.e (crip ['%' (trip tag.e)])]]
74797585 [%tuple at.e ~[[at.e ~ head] [(span-of val.e) ~ val.e]]]
74807586::
7587+:: A segment costs one shared step; dynamic segments are not handled yet.
7588+++ qath-static-fuel
7589+ |= [segs=(list qseg) fuel=@ud]
7590+ ^- (unit @ud)
7591+ ?~ segs `fuel
7592+ ?: =(0 fuel) ~
7593+ ?. ?=(%knot -.i.segs) ~
7594+ $(segs t.segs, fuel (dec fuel))
7595+::
74817596++ infer-fragment
74827597 |= [e=expr env=ienv state=istate]
74837598 ^- iresult
@@ -7520,6 +7635,21 @@
75207635 ?: ?=(%| -.result) result
75217636 [%& [%collection %list ~[element]] state.p.result]
75227637 %str (infer-string-pieces pieces.e env state)
7638+ %qath
7639+ ?~ prelude.state [%| ["application path needs the standard prelude in partial inference" ~]]
7640+ ?. =(at.u.prelude.state /lib/jibb/prelude/jibb)
7641+ [%| ["application path needs the standard prelude in partial inference" ~]]
7642+ =/ standard=(unit ischeme) (find-jibb-mold %qath u.prelude.state)
7643+ ?~ standard [%| ["application path needs the standard prelude in partial inference" ~]]
7644+ ?. ?=(~ vars.u.standard) [%| ["application path mold needs unsupported inference" ~]]
7645+ =/ typ=itype typ.u.standard
7646+ ?. ?=(%jrec -.typ) [%| ["application path mold needs unsupported inference" ~]]
7647+ ?. &(=(at.typ /lib/jibb/internal/jibb) =(%qath name.typ) =(%i head.typ) =(%ta aura.typ) =(%t tail.typ))
7648+ [%| ["application path mold needs unsupported inference" ~]]
7649+ ?: =(0 jrec-fuel.state) [%| ["recursive mold unfolding needs unsupported inference" ~]]
7650+ =/ remain=(unit @ud) (qath-static-fuel segs.e (dec jrec-fuel.state))
7651+ ?~ remain [%| ["application path segments need unsupported inference" ~]]
7652+ [%& typ state(jrec-fuel u.remain)]
75237653 %wing
75247654 ?~ names.e [%| ["empty wing" ~]]
75257655 ?^ t.names.e
@@ -7805,6 +7935,22 @@
78057935 =/ target=itype (itype-walk expected sub.state)
78067936 |-
78077937 ?: ?=(%face -.target) $(target (itype-walk body.target sub.state))
7938+ :: Only the source-proven one-layer cell is exposed. Each recursive
7939+ :: descent consumes one written tuple; named values use ordinary fit.
7940+ ?: &(?=(%jrec -.target) ?=(%lit -.e) =(%null form.lit.e))
7941+ ?: =(0 jrec-fuel.state) [%| ["recursive mold unfolding needs unsupported inference" ~]]
7942+ [%& target state(jrec-fuel (dec jrec-fuel.state))]
7943+ ?: &(?=(%jrec -.target) ?=(%tuple -.e))
7944+ ?: =(0 jrec-fuel.state) [%| ["recursive mold unfolding needs unsupported inference" ~]]
7945+ =. state state(jrec-fuel (dec jrec-fuel.state))
7946+ =/ shape=itype
7947+ [%cell [%face head.target [%atom aura.target]] [%face tail.target target]]
7948+ =/ value=iresult (infer-call-context-items items.e shape env state context)
7949+ ?: ?=(%| -.value) value
7950+ =/ fit=ifit (itype-fit typ.p.value shape sub.state.p.value next.state.p.value)
7951+ ?: ?=(%unknown -.fit) [%| ["recursive mold cell constraint needs unsupported inference" ~]]
7952+ ?: ?=(%bad -.fit) [%| ["recursive mold cell does not fit its source shape" ~]]
7953+ [%& target state.p.value(sub sub.fit, next next.fit)]
78087954 ?: ?=(%call -.e) (infer-contextual-call e target env state)
78097955 ?: (single-structured-pattern e)
78107956 (infer-single-case-branch e env state `[target context])
@@ -7929,7 +8075,7 @@
79298075 ?~ t.names |
79308076 =. typ (itype-walk typ sub)
79318077 ?: ?=(%cell -.typ) $(typ tal.typ, names t.names)
7932− |(?=(%union -.typ) ?=(%collection -.typ) ?=(%recursive -.typ) ?=(%noun -.typ) ?=(%fn -.typ) ?=(%tag -.typ))
8078+ |(?=(%union -.typ) ?=(%collection -.typ) ?=(%recursive -.typ) ?=(%jrec -.typ) ?=(%noun -.typ) ?=(%fn -.typ) ?=(%tag -.typ))
79338079::
79348080++ cell-binder-pattern
79358081 |= e=expr
@@ -8001,6 +8147,7 @@
80018147 ?~ args.t (trip u.label.t)
80028148 "({(trip u.label.t)} {(show-itype-cases args.t sub)})"
80038149 %recursive ?~(label.t "recursive mold" (trip u.label.t))
8150+ %jrec ?~(label.t "recursive mold" (trip u.label.t))
80048151 %collection "({(trip name.t)} {(show-itype-cases args.t sub)})"
80058152 %face "[{(trip name.t)}={(show-itype-context body.t sub)}]"
80068153 %fn "$-({(show-itype-context sample.t sub)} {(show-itype-context product.t sub)})"
@@ -8046,6 +8193,7 @@
80468193 %const |
80478194 %union |((lien cases.typ |=(c=itype (itype-has-nvar c))) (lien args.typ |=(c=itype (itype-has-nvar c))))
80488195 %recursive |
8196+ %jrec |
80498197 %collection (lien args.typ |=(c=itype (itype-has-nvar c)))
80508198 %face $(typ body.typ)
80518199 %fn |($(typ sample.typ) $(typ product.typ))
@@ -8155,6 +8303,7 @@
81558303 %const |
81568304 %union |((lien cases.t |=(c=itype (has-atom-var n c))) (lien args.t |=(c=itype (has-atom-var n c))))
81578305 %recursive |
8306+ %jrec |
81588307 %collection (lien args.t |=(c=itype (has-atom-var n c)))
81598308 %face $(t body.t)
81608309 %fn |($(t sample.t) $(t product.t))
@@ -8545,7 +8694,7 @@
85458694 ?. (unique-value-name name.d globals) $(ds t.ds)
85468695 ?^ (ienv-lookup name.d env) $(ds t.ds)
85478696 =/ top=(list term) (turn molds |=(m=[name=term body=shape] name.m))
8548− =/ initial=istate [0 ~ ~ ~ molds globals externals surs mark-externals marks jimports reserved-molds ~ ~ ~ | at top prelude ~]
8697+ =/ initial=istate [0 ~ ~ ~ molds globals externals surs mark-externals marks jimports reserved-molds ~ ~ ~ | at top prelude ~ 256]
85498698 =. initial (reserve-def-caps val.d initial)
85508699 =/ result=iresult (infer-fragment val.d env initial)
85518700 =? result ?=(%| -.result) (infer-recursive-gate d env initial)
@@ -8682,7 +8831,7 @@
86828831 =/ top=(list term) (turn molds |=(m=[name=term body=shape] name.m))
86838832 |-
86848833 =/ next=ienv (add-supported-defs ds env molds globals externals surs mark-externals marks jimports reserved-molds at prelude)
8685− =/ initial=istate [0 ~ ~ ~ molds globals externals surs mark-externals marks jimports reserved-molds ~ ~ ~ | at top prelude ~]
8834+ =/ initial=istate [0 ~ ~ ~ molds globals externals surs mark-externals marks jimports reserved-molds ~ ~ ~ | at top prelude ~ 256]
86868835 =/ out=iresolved (add-groups ds components graph next grouped initial)
86878836 ?: =(env env.out) out
86888837 $(env env.out, grouped grouped.out)
@@ -9426,6 +9575,7 @@
94269575++ prelude-label
94279576 |= [typ=itype name=term]
94289577 ^- itype
9578+ ?: ?=(%jrec -.typ) typ(label `name)
94299579 ?. ?=(%union -.typ) typ
94309580 ?^ args.typ typ
94319581 typ(label `name)
@@ -9476,7 +9626,7 @@
94769626 =/ js=ijimports ~[[face.i.imports.mod private-primitive-interface]]
94779627 =/ reserved=(list term) ~[face.i.imports.mod]
94789628 =/ top=(list term) (turn molds |=(m=[name=term body=shape] name.m))
9479− =/ state=istate [0 ~ ~ ~ molds globals ~ ~ ~ ~ js reserved ~ ~ ~ | at top ~ ~]
9629+ =/ state=istate [0 ~ ~ ~ molds globals ~ ~ ~ ~ js reserved ~ ~ ~ | at top ~ ~ 256]
94809630 =/ mts=(each imold-types @t) (module-mold-types molds state)
94819631 ?: ?=(%| -.mts) ~
94829632 =/ env=ienv (resolve-supported-defs defs.mod molds globals ~ ~ ~ ~ js reserved at ~)
@@ -9514,7 +9664,7 @@
95149664 =? env-molds declared
95159665 (skim molds |=(m=[name=term body=shape] !=(%list name.m)))
95169666 =/ reserved=(list term) ?:(declared ~[%list] ~)
9517− =/ state=istate [0 ~ ~ ~ env-molds globals ~ ~ ~ ~ u.private reserved ~ ~ ~ | at names ~ ~]
9667+ =/ state=istate [0 ~ ~ ~ env-molds globals ~ ~ ~ ~ u.private reserved ~ ~ ~ | at names ~ ~ 256]
95189668 :: Other prelude molds may use list only after its source has passed
95199669 :: the standard-list check. The raw declaration remains removed.
95209670 =/ declared-list=(unit shape) (find-simple-mold %list molds)
@@ -9901,7 +10051,7 @@
990110051 =/ marks=(list term) (collect-mark-imports imports.mod)
990210052 =/ reserved=(list term) (weld prelude-molds (turn resolved.p.js |=(j=[face=term interface=ifile] face.j)))
990310053 =/ top=(list term) (turn molds |=(m=[name=term body=shape] name.m))
9904− =/ state=istate [0 ~ ~ ~ molds globals externals surs mark-externals marks resolved.p.js reserved ~ ~ ~ | at top prelude ~]
10054+ =/ state=istate [0 ~ ~ ~ molds globals externals surs mark-externals marks resolved.p.js reserved ~ ~ ~ | at top prelude ~ 256]
990510055 =/ mts=(each imold-types @t) (module-mold-types molds state)
990610056 ?: ?=(%| -.mts) [%| (crip "{(trip p.mts)}: {(spud at)}")]
990710057 =/ env=ienv (resolve-supported-defs defs.mod molds globals externals surs mark-externals marks resolved.p.js reserved at prelude)
@@ -10032,7 +10182,7 @@
1003210182 =/ line=@t (crip "++ {(trip name.d)}: {(show-itype typ ~)}{(show-atom-constraint typ)}")
1003310183 $(ds t.ds, lines [line lines])
1003410184 =/ top=(list term) (turn molds |=(m=[name=term body=shape] name.m))
10035− =/ initial=istate [0 ~ ~ ~ molds globals externals surs mark-externals marks jimports reserved-molds ~ ~ ~ | file top prelude ~]
10185+ =/ initial=istate [0 ~ ~ ~ molds globals externals surs mark-externals marks jimports reserved-molds ~ ~ ~ | file top prelude ~ 256]
1003610186 =. initial (reserve-def-caps val.d initial)
1003710187 =/ result=iresult
1003810188 ?: |(?=(%gate -.val.d) ?=(%gate-wide -.val.d))
jibb-dev/lib/jibb/internal.jibb+5
@@ -9,3 +9,8 @@
99
1010:: The compiler supplies this private interface; execution is not yet implemented.
1111++ gth-atom |= args=[A A] (raw-gth.core args)
12+
13+:: Application paths are knot sequences.
14++$ qath
15+ ~
16+ [i=@ta t=qath]
jibb-dev/lib/jibb/prelude.jibb+1
@@ -1,5 +1,6 @@
11/= internal /lib/jibb/internal
22+$ poke poke.internal
3++$ qath qath.internal
34
45:: Initial prelude functions. The rest of the inventory is still to come.
56
tests/golden/types-qath-faces/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar, Types and molds: faces are part of a record type; unnamed fields may acquire faces.
2+tests: Concrete qath values fit faced fields in both directions, distinct explicit faces conflict, and a previously bound inference variable does not silently acquire an unresolved face.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/types-qath-faces/modules.txtnew file+1
@@ -0,0 +1 @@
1+# Use the source-backed prelude.
tests/golden/types-qath-faces/source.jibbnew file+8
@@ -0,0 +1,8 @@
1+++ concrete |= x=qath ^- [field=qath yes=?] [x %.y]
2+++ reverse |= x=[field=qath yes=?] ^- [qath ?] x
3+++ mismatch |= x=[bad=qath yes=?] ^- [good=qath yes=?] x
4+++ previously-bound |= x
5+ ~& ^- qath x
6+ ^- [field=qath yes=?] [x %.y]
7+++ nested-bad |= x=[outer=[bad=qath yes=?] done=?]
8+ ^- [outer=[good=qath yes=?] done=?] x
tests/golden/types-qath-faces/tokens.txtnew file+130
@@ -0,0 +1,130 @@
1+1:1 glyph ++
2+1:4 name concrete
3+1:13 glyph |=
4+1:16 name x
5+1:17 tight glyph =
6+1:18 tight name qath
7+1:23 glyph ^-
8+1:26 glyph [
9+1:27 tight name field
10+1:32 tight glyph =
11+1:33 tight name qath
12+1:38 name yes
13+1:41 tight glyph =
14+1:42 tight glyph ?
15+1:43 tight glyph ]
16+1:45 glyph [
17+1:46 tight name x
18+1:48 lit %.y
19+1:51 tight glyph ]
20+2:1 NEWLINE
21+2:1 glyph ++
22+2:4 name reverse
23+2:12 glyph |=
24+2:15 name x
25+2:16 tight glyph =
26+2:17 tight glyph [
27+2:18 tight name field
28+2:23 tight glyph =
29+2:24 tight name qath
30+2:29 name yes
31+2:32 tight glyph =
32+2:33 tight glyph ?
33+2:34 tight glyph ]
34+2:36 glyph ^-
35+2:39 glyph [
36+2:40 tight name qath
37+2:45 glyph ?
38+2:46 tight glyph ]
39+2:48 name x
40+3:1 NEWLINE
41+3:1 glyph ++
42+3:4 name mismatch
43+3:13 glyph |=
44+3:16 name x
45+3:17 tight glyph =
46+3:18 tight glyph [
47+3:19 tight name bad
48+3:22 tight glyph =
49+3:23 tight name qath
50+3:28 name yes
51+3:31 tight glyph =
52+3:32 tight glyph ?
53+3:33 tight glyph ]
54+3:35 glyph ^-
55+3:38 glyph [
56+3:39 tight name good
57+3:43 tight glyph =
58+3:44 tight name qath
59+3:49 name yes
60+3:52 tight glyph =
61+3:53 tight glyph ?
62+3:54 tight glyph ]
63+3:56 name x
64+4:1 NEWLINE
65+4:1 glyph ++
66+4:4 name previously-bound
67+4:21 glyph |=
68+4:24 name x
69+5:3 INDENT
70+5:3 glyph ~&
71+5:6 glyph ^-
72+5:9 name qath
73+5:14 name x
74+6:5 INDENT
75+6:5 glyph ^-
76+6:8 glyph [
77+6:9 tight name field
78+6:14 tight glyph =
79+6:15 tight name qath
80+6:20 name yes
81+6:23 tight glyph =
82+6:24 tight glyph ?
83+6:25 tight glyph ]
84+6:27 glyph [
85+6:28 tight name x
86+6:30 lit %.y
87+6:33 tight glyph ]
88+7:1 DEDENT
89+7:1 DEDENT
90+7:1 NEWLINE
91+7:1 glyph ++
92+7:4 name nested-bad
93+7:15 glyph |=
94+7:18 name x
95+7:19 tight glyph =
96+7:20 tight glyph [
97+7:21 tight name outer
98+7:26 tight glyph =
99+7:27 tight glyph [
100+7:28 tight name bad
101+7:31 tight glyph =
102+7:32 tight name qath
103+7:37 name yes
104+7:40 tight glyph =
105+7:41 tight glyph ?
106+7:42 tight glyph ]
107+7:44 name done
108+7:48 tight glyph =
109+7:49 tight glyph ?
110+7:50 tight glyph ]
111+8:3 INDENT
112+8:3 glyph ^-
113+8:6 glyph [
114+8:7 tight name outer
115+8:12 tight glyph =
116+8:13 tight glyph [
117+8:14 tight name good
118+8:18 tight glyph =
119+8:19 tight name qath
120+8:24 name yes
121+8:27 tight glyph =
122+8:28 tight glyph ?
123+8:29 tight glyph ]
124+8:31 name done
125+8:35 tight glyph =
126+8:36 tight glyph ?
127+8:37 tight glyph ]
128+8:39 name x
129+8:40 DEDENT
130+8:40 NEWLINE
tests/golden/types-qath-faces/tree.txtnew file+59
@@ -0,0 +1,59 @@
1+(module
2+ (value 1:1 concrete
3+ (gate 1:13
4+ (face 1:16 x (ref 1:18 qath))
5+ (cast 1:23
6+ (cell 1:26
7+ (face 1:27 field (ref 1:33 qath))
8+ (face 1:38 yes (flag 1:42)))
9+ (tuple 1:45 (wing 1:46 x) (lit 1:48 %.y)))))
10+ (value 2:1 reverse
11+ (gate 2:12
12+ (face 2:15 x
13+ (cell 2:17
14+ (face 2:18 field (ref 2:24 qath))
15+ (face 2:29 yes (flag 2:33))))
16+ (cast 2:36
17+ (cell 2:39 (ref 2:40 qath) (flag 2:45))
18+ (wing 2:48 x))))
19+ (value 3:1 mismatch
20+ (gate 3:13
21+ (face 3:16 x
22+ (cell 3:18
23+ (face 3:19 bad (ref 3:23 qath))
24+ (face 3:28 yes (flag 3:32))))
25+ (cast 3:35
26+ (cell 3:38
27+ (face 3:39 good (ref 3:44 qath))
28+ (face 3:49 yes (flag 3:53)))
29+ (wing 3:56 x))))
30+ (value 4:1 previously-bound
31+ (gate 4:21
32+ (bind 4:24 x)
33+ (body 5:3
34+ (trace 5:3
35+ (cast 5:6 (ref 5:9 qath) (wing 5:14 x))
36+ (body 6:5
37+ (cast 6:5
38+ (cell 6:8
39+ (face 6:9 field (ref 6:15 qath))
40+ (face 6:20 yes (flag 6:24)))
41+ (tuple 6:27 (wing 6:28 x) (lit 6:30 %.y))))))))
42+ (value 7:1 nested-bad
43+ (gate 7:15
44+ (face 7:18 x
45+ (cell 7:20
46+ (face 7:21 outer
47+ (cell 7:27
48+ (face 7:28 bad (ref 7:32 qath))
49+ (face 7:37 yes (flag 7:41))))
50+ (face 7:44 done (flag 7:49))))
51+ (body 8:3
52+ (cast 8:3
53+ (cell 8:6
54+ (face 8:7 outer
55+ (cell 8:13
56+ (face 8:14 good (ref 8:19 qath))
57+ (face 8:24 yes (flag 8:28))))
58+ (face 8:31 done (flag 8:36)))
59+ (wing 8:39 x))))))
tests/golden/types-qath-faces/types.txtnew file+18
@@ -0,0 +1,18 @@
1+partial inference; module not checked
2+++ concrete: $-(qath [field=qath yes=?])
3+++ reverse: $-([field=qath yes=?] [field=qath yes=?])
4+++ mismatch: cast mold and expression type do not unify
5+/tests/golden/types-qath-faces/source.jibb:3:38: cast mold has type [good=qath yes=?]
6+++ mismatch |= x=[bad=qath yes=?] ^- [good=qath yes=?] x
7+ ^
8+/tests/golden/types-qath-faces/source.jibb:3:56: expression has type [bad=qath yes=?]
9+++ mismatch |= x=[bad=qath yes=?] ^- [good=qath yes=?] x
10+ ^
11+++ previously-bound: cast constraint is not supported by partial inference
12+++ nested-bad: cast mold and expression type do not unify
13+/tests/golden/types-qath-faces/source.jibb:8:6: cast mold has type [outer=[good=qath yes=?] done=?]
14+ ^- [outer=[good=qath yes=?] done=?] x
15+ ^
16+/tests/golden/types-qath-faces/source.jibb:8:39: expression has type [outer=[bad=qath yes=?] done=?]
17+ ^- [outer=[good=qath yes=?] done=?] x
18+ ^
tests/golden/types-qath-holes/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar, Types and molds: type holes, and the transparent qath type.
2+tests: Holes determined by qath resolve, while independent local/sample holes and pending tags survive contextual construction and static literals; a fixed incompatible head is rejected; decimal defaulting works in qath-containing records and remains conservative for composite holes or actual gates.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/types-qath-holes/modules.txtnew file+1
@@ -0,0 +1 @@
1+# Use the source-backed prelude.
tests/golden/types-qath-holes/source.jibbnew file+18
@@ -0,0 +1,18 @@
1+++ resolved |= x=qath ^- _ x
2+++ literal ^- _ %/foo
3+++ nested ^- _ ^- qath [i=~.hello t=[i=~.world t=~]]
4+++ isolated |= [p=qath other=_] p
5+++ local-hole
6+ ++ ignored |= x=_ x
7+ ^- qath [i=~.hello t=~]
8+++ pending-construction
9+ ~& %orphan
10+ ^- qath [i=~.hello t=~]
11+++ pending-literal
12+ ~& %orphan
13+ %/foo
14+++ wrong-head ^- qath [i=~zod t=~]
15+++ record-number [path=%/foo n=1]
16+++ nested-number [payload=[path=%/foo] n=1]
17+++ composite-hole ^- _ [path=%/foo n=1]
18+++ returned-gate [path=%/foo f=|=(x x) n=1]
tests/golden/types-qath-holes/tokens.txtnew file+178
@@ -0,0 +1,178 @@
1+1:1 glyph ++
2+1:4 name resolved
3+1:13 glyph |=
4+1:16 name x
5+1:17 tight glyph =
6+1:18 tight name qath
7+1:23 glyph ^-
8+1:26 glyph _
9+1:28 name x
10+2:1 NEWLINE
11+2:1 glyph ++
12+2:4 name literal
13+2:12 glyph ^-
14+2:15 glyph _
15+2:17 glyph %/
16+2:19 tight knot foo
17+3:1 NEWLINE
18+3:1 glyph ++
19+3:4 name nested
20+3:11 glyph ^-
21+3:14 glyph _
22+3:16 glyph ^-
23+3:19 name qath
24+3:24 glyph [
25+3:25 tight name i
26+3:26 tight glyph =
27+3:27 tight lit ~.hello
28+3:35 name t
29+3:36 tight glyph =
30+3:37 tight glyph [
31+3:38 tight name i
32+3:39 tight glyph =
33+3:40 tight lit ~.world
34+3:48 name t
35+3:49 tight glyph =
36+3:50 tight lit ~
37+3:51 tight glyph ]
38+3:52 tight glyph ]
39+4:1 NEWLINE
40+4:1 glyph ++
41+4:4 name isolated
42+4:13 glyph |=
43+4:16 glyph [
44+4:17 tight name p
45+4:18 tight glyph =
46+4:19 tight name qath
47+4:24 name other
48+4:29 tight glyph =
49+4:30 tight glyph _
50+4:31 tight glyph ]
51+4:33 name p
52+5:1 NEWLINE
53+5:1 glyph ++
54+5:4 name local-hole
55+6:3 INDENT
56+6:3 glyph ++
57+6:6 name ignored
58+6:14 glyph |=
59+6:17 name x
60+6:18 tight glyph =
61+6:19 tight glyph _
62+6:21 name x
63+7:3 NEWLINE
64+7:3 glyph ^-
65+7:6 name qath
66+7:11 glyph [
67+7:12 tight name i
68+7:13 tight glyph =
69+7:14 tight lit ~.hello
70+7:22 name t
71+7:23 tight glyph =
72+7:24 tight lit ~
73+7:25 tight glyph ]
74+8:1 DEDENT
75+8:1 NEWLINE
76+8:1 glyph ++
77+8:4 name pending-construction
78+9:3 INDENT
79+9:3 glyph ~&
80+9:6 lit %orphan
81+10:5 INDENT
82+10:5 glyph ^-
83+10:8 name qath
84+10:13 glyph [
85+10:14 tight name i
86+10:15 tight glyph =
87+10:16 tight lit ~.hello
88+10:24 name t
89+10:25 tight glyph =
90+10:26 tight lit ~
91+10:27 tight glyph ]
92+11:1 DEDENT
93+11:1 DEDENT
94+11:1 NEWLINE
95+11:1 glyph ++
96+11:4 name pending-literal
97+12:3 INDENT
98+12:3 glyph ~&
99+12:6 lit %orphan
100+13:5 INDENT
101+13:5 glyph %/
102+13:7 tight knot foo
103+14:1 DEDENT
104+14:1 DEDENT
105+14:1 NEWLINE
106+14:1 glyph ++
107+14:4 name wrong-head
108+14:15 glyph ^-
109+14:18 name qath
110+14:23 glyph [
111+14:24 tight name i
112+14:25 tight glyph =
113+14:26 tight lit ~zod
114+14:31 name t
115+14:32 tight glyph =
116+14:33 tight lit ~
117+14:34 tight glyph ]
118+15:1 NEWLINE
119+15:1 glyph ++
120+15:4 name record-number
121+15:18 glyph [
122+15:19 tight name path
123+15:23 tight glyph =
124+15:24 tight glyph %/
125+15:26 tight knot foo
126+15:30 name n
127+15:31 tight glyph =
128+15:32 tight lit 1
129+15:33 tight glyph ]
130+16:1 NEWLINE
131+16:1 glyph ++
132+16:4 name nested-number
133+16:18 glyph [
134+16:19 tight name payload
135+16:26 tight glyph =
136+16:27 tight glyph [
137+16:28 tight name path
138+16:32 tight glyph =
139+16:33 tight glyph %/
140+16:35 tight knot foo
141+16:38 tight glyph ]
142+16:40 name n
143+16:41 tight glyph =
144+16:42 tight lit 1
145+16:43 tight glyph ]
146+17:1 NEWLINE
147+17:1 glyph ++
148+17:4 name composite-hole
149+17:19 glyph ^-
150+17:22 glyph _
151+17:24 glyph [
152+17:25 tight name path
153+17:29 tight glyph =
154+17:30 tight glyph %/
155+17:32 tight knot foo
156+17:36 name n
157+17:37 tight glyph =
158+17:38 tight lit 1
159+17:39 tight glyph ]
160+18:1 NEWLINE
161+18:1 glyph ++
162+18:4 name returned-gate
163+18:18 glyph [
164+18:19 tight name path
165+18:23 tight glyph =
166+18:24 tight glyph %/
167+18:26 tight knot foo
168+18:30 name f
169+18:31 tight glyph =
170+18:32 tight glyph |=(
171+18:35 tight name x
172+18:37 name x
173+18:38 tight glyph )
174+18:40 name n
175+18:41 tight glyph =
176+18:42 tight lit 1
177+18:43 tight glyph ]
178+18:44 NEWLINE
tests/golden/types-qath-holes/tree.txtnew file+78
@@ -0,0 +1,78 @@
1+(module
2+ (value 1:1 resolved
3+ (gate 1:13
4+ (face 1:16 x (ref 1:18 qath))
5+ (cast 1:23 (hole 1:26) (wing 1:28 x))))
6+ (value 2:1 literal
7+ (cast 2:12 (hole 2:15) (qath 2:17 foo)))
8+ (value 3:1 nested
9+ (cast 3:11
10+ (hole 3:14)
11+ (cast 3:16
12+ (ref 3:19 qath)
13+ (tuple 3:24
14+ (face 3:25 i (lit 3:27 ~.hello))
15+ (face 3:35 t
16+ (tuple 3:37
17+ (face 3:38 i (lit 3:40 ~.world))
18+ (face 3:48 t (lit 3:50 ~))))))))
19+ (value 4:1 isolated
20+ (gate 4:13
21+ (cell 4:16
22+ (face 4:17 p (ref 4:19 qath))
23+ (face 4:24 other (hole 4:30)))
24+ (wing 4:33 p)))
25+ (value 5:1 local-hole
26+ (body 6:3
27+ (value 6:3 ignored
28+ (gate 6:14
29+ (face 6:17 x (hole 6:19))
30+ (wing 6:21 x)))
31+ (cast 7:3
32+ (ref 7:6 qath)
33+ (tuple 7:11
34+ (face 7:12 i (lit 7:14 ~.hello))
35+ (face 7:22 t (lit 7:24 ~))))))
36+ (value 8:1 pending-construction
37+ (body 9:3
38+ (trace 9:3
39+ (lit 9:6 %orphan)
40+ (body 10:5
41+ (cast 10:5
42+ (ref 10:8 qath)
43+ (tuple 10:13
44+ (face 10:14 i (lit 10:16 ~.hello))
45+ (face 10:24 t (lit 10:26 ~))))))))
46+ (value 11:1 pending-literal
47+ (body 12:3
48+ (trace 12:3
49+ (lit 12:6 %orphan)
50+ (body 13:5 (qath 13:5 foo)))))
51+ (value 14:1 wrong-head
52+ (cast 14:15
53+ (ref 14:18 qath)
54+ (tuple 14:23
55+ (face 14:24 i (lit 14:26 ~zod))
56+ (face 14:31 t (lit 14:33 ~)))))
57+ (value 15:1 record-number
58+ (tuple 15:18
59+ (face 15:19 path (qath 15:24 foo))
60+ (face 15:30 n (lit 15:32 1))))
61+ (value 16:1 nested-number
62+ (tuple 16:18
63+ (face 16:19 payload
64+ (tuple 16:27
65+ (face 16:28 path (qath 16:33 foo))))
66+ (face 16:40 n (lit 16:42 1))))
67+ (value 17:1 composite-hole
68+ (cast 17:19
69+ (hole 17:22)
70+ (tuple 17:24
71+ (face 17:25 path (qath 17:30 foo))
72+ (face 17:36 n (lit 17:38 1)))))
73+ (value 18:1 returned-gate
74+ (tuple 18:18
75+ (face 18:19 path (qath 18:24 foo))
76+ (face 18:30 f
77+ (gate-wide 18:32 (bind 18:35 x) (wing 18:37 x)))
78+ (face 18:40 n (lit 18:42 1)))))
tests/golden/types-qath-holes/types.txtnew file+22
@@ -0,0 +1,22 @@
1+partial inference; module not checked
2+++ resolved: $-(qath qath)
3+++ literal: qath
4+++ nested: qath
5+++ isolated: type hole needs a determined type
6+/tests/golden/types-qath-holes/source.jibb:4:30: unresolved type hole
7+++ isolated |= [p=qath other=_] p
8+ ^
9+++ local-hole: type hole needs a determined type
10+/tests/golden/types-qath-holes/source.jibb:6:19: unresolved type hole
11+ ++ ignored |= x=_ x
12+ ^
13+++ pending-construction: tag needs context in partial inference
14+++ pending-literal: tag needs context in partial inference
15+++ wrong-head: recursive mold cell does not fit its source shape
16+++ record-number: [path=qath n=@ud]
17+++ nested-number: [payload=[path=qath] n=@ud]
18+++ composite-hole: type hole needs unsupported inference
19+/tests/golden/types-qath-holes/source.jibb:17:22: type hole
20+++ composite-hole ^- _ [path=%/foo n=1]
21+ ^
22+++ returned-gate: unresolved aura-variable inference
tests/golden/types-qath-module-identity/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Molds: named recursive molds retain their source identity across module aliases and reexports.
2+tests: Equivalent imports and aliases of a recursive mold, a transitive alias, the public prelude qath, different source origins and list comparisons.
3+expect: parses
4+expect-types: a partial inference report; recursive-origin mismatches are rejected and list comparisons remain unsupported.
tests/golden/types-qath-module-identity/module-trees.txtnew file+44
@@ -0,0 +1,44 @@
1+/ui/one.jibb
2+(module
3+ (mold 1:1 alpha
4+ (union 2:3
5+ (const 2:3 ~)
6+ (cell 3:3
7+ (face 3:4 i (aura 3:6 @ta))
8+ (face 3:10 t (ref 3:12 alpha)))))
9+ (mold 4:1 exported (ref 4:13 alpha))
10+ (mold 5:1 route (ref 5:10 qath))
11+ (value 6:1 identity
12+ (gate 6:13
13+ (face 6:16 x (ref 6:18 alpha))
14+ (wing 6:24 x)))
15+ (value 7:1 qidentity
16+ (gate 7:14
17+ (face 7:17 x (ref 7:19 qath))
18+ (wing 7:24 x))))
19+/ui/two.jibb
20+(module
21+ (mold 1:1 alpha
22+ (union 2:3
23+ (const 2:3 ~)
24+ (cell 3:3
25+ (face 3:4 i (aura 3:6 @ta))
26+ (face 3:10 t (ref 3:12 alpha)))))
27+ (value 4:1 identity
28+ (gate 4:13
29+ (face 4:16 x (ref 4:18 alpha))
30+ (wing 4:24 x))))
31+/ui/mid.jibb
32+(module
33+ (jibb 1:1 base /ui/one)
34+ (mold 2:1 result (ref 2:11 exported.base))
35+ (value 3:1 forward
36+ (gate 3:12
37+ (face 3:15 x (ref 3:17 result))
38+ (group 3:24
39+ (call 3:25 (wing 3:25 identity.base) (wing 3:39 x)))))
40+ (value 4:1 forward-q
41+ (gate 4:14
42+ (face 4:17 x (ref 4:19 qath))
43+ (group 4:24
44+ (call 4:25 (wing 4:25 qidentity.base) (wing 4:40 x))))))
tests/golden/types-qath-module-identity/modules.txtnew file+3
@@ -0,0 +1,3 @@
1+/ui/one.jibb
2+/ui/two.jibb
3+/ui/mid.jibb
tests/golden/types-qath-module-identity/modules/ui/mid.jibbnew file+4
@@ -0,0 +1,4 @@
1+/= base /ui/one
2++$ result exported.base
3+++ forward |= x=result (identity.base x)
4+++ forward-q |= x=qath (qidentity.base x)
tests/golden/types-qath-module-identity/modules/ui/one.jibbnew file+7
@@ -0,0 +1,7 @@
1++$ alpha
2+ ~
3+ [i=@ta t=alpha]
4++$ exported alpha
5++$ route qath
6+++ identity |= x=alpha x
7+++ qidentity |= x=qath x
tests/golden/types-qath-module-identity/modules/ui/two.jibbnew file+4
@@ -0,0 +1,4 @@
1++$ alpha
2+ ~
3+ [i=@ta t=alpha]
4+++ identity |= x=alpha x
tests/golden/types-qath-module-identity/source.jibbnew file+15
@@ -0,0 +1,15 @@
1+/= one /ui/one
2+/= other /ui/one
3+/= two /ui/two
4+/= mid /ui/mid
5+++ same-origin |= x=alpha.one (identity.other x)
6+++ same-alias |= x=exported.one (identity.other x)
7+++ different |= x=alpha.one (identity.two x)
8+++ transit |= x=result.mid (forward.mid x)
9+++ prelude |= x=qath (qidentity.one x)
10+++ public-alias |= x=route.one (forward-q.mid x)
11+++ same-tail |= x=alpha.other ^- alpha.one [i=~.hello t=x]
12+++ other-tail |= x=alpha.two ^- alpha.one [i=~.hello t=x]
13+++ qath-tail |= x=qath ^- alpha.one [i=~.hello t=x]
14+++ list-to-qath |= x=(list @ta) ^- qath x
15+++ qath-to-list |= x=qath ^- (list @ta) x
tests/golden/types-qath-module-identity/tokens.txtnew file+171
@@ -0,0 +1,171 @@
1+1:1 glyph /=
2+1:4 name one
3+1:8 glyph /
4+1:9 tight knot ui
5+1:11 tight glyph /
6+1:12 tight knot one
7+2:1 NEWLINE
8+2:1 glyph /=
9+2:4 name other
10+2:10 glyph /
11+2:11 tight knot ui
12+2:13 tight glyph /
13+2:14 tight knot one
14+3:1 NEWLINE
15+3:1 glyph /=
16+3:4 name two
17+3:8 glyph /
18+3:9 tight knot ui
19+3:11 tight glyph /
20+3:12 tight knot two
21+4:1 NEWLINE
22+4:1 glyph /=
23+4:4 name mid
24+4:8 glyph /
25+4:9 tight knot ui
26+4:11 tight glyph /
27+4:12 tight knot mid
28+5:1 NEWLINE
29+5:1 glyph ++
30+5:4 name same-origin
31+5:16 glyph |=
32+5:19 name x
33+5:20 tight glyph =
34+5:21 tight wing alpha.one
35+5:31 glyph (
36+5:32 tight wing identity.other
37+5:47 name x
38+5:48 tight glyph )
39+6:1 NEWLINE
40+6:1 glyph ++
41+6:4 name same-alias
42+6:15 glyph |=
43+6:18 name x
44+6:19 tight glyph =
45+6:20 tight wing exported.one
46+6:33 glyph (
47+6:34 tight wing identity.other
48+6:49 name x
49+6:50 tight glyph )
50+7:1 NEWLINE
51+7:1 glyph ++
52+7:4 name different
53+7:14 glyph |=
54+7:17 name x
55+7:18 tight glyph =
56+7:19 tight wing alpha.one
57+7:29 glyph (
58+7:30 tight wing identity.two
59+7:43 name x
60+7:44 tight glyph )
61+8:1 NEWLINE
62+8:1 glyph ++
63+8:4 name transit
64+8:12 glyph |=
65+8:15 name x
66+8:16 tight glyph =
67+8:17 tight wing result.mid
68+8:28 glyph (
69+8:29 tight wing forward.mid
70+8:41 name x
71+8:42 tight glyph )
72+9:1 NEWLINE
73+9:1 glyph ++
74+9:4 name prelude
75+9:12 glyph |=
76+9:15 name x
77+9:16 tight glyph =
78+9:17 tight name qath
79+9:22 glyph (
80+9:23 tight wing qidentity.one
81+9:37 name x
82+9:38 tight glyph )
83+10:1 NEWLINE
84+10:1 glyph ++
85+10:4 name public-alias
86+10:17 glyph |=
87+10:20 name x
88+10:21 tight glyph =
89+10:22 tight wing route.one
90+10:32 glyph (
91+10:33 tight wing forward-q.mid
92+10:47 name x
93+10:48 tight glyph )
94+11:1 NEWLINE
95+11:1 glyph ++
96+11:4 name same-tail
97+11:14 glyph |=
98+11:17 name x
99+11:18 tight glyph =
100+11:19 tight wing alpha.other
101+11:31 glyph ^-
102+11:34 wing alpha.one
103+11:44 glyph [
104+11:45 tight name i
105+11:46 tight glyph =
106+11:47 tight lit ~.hello
107+11:55 name t
108+11:56 tight glyph =
109+11:57 tight name x
110+11:58 tight glyph ]
111+12:1 NEWLINE
112+12:1 glyph ++
113+12:4 name other-tail
114+12:15 glyph |=
115+12:18 name x
116+12:19 tight glyph =
117+12:20 tight wing alpha.two
118+12:30 glyph ^-
119+12:33 wing alpha.one
120+12:43 glyph [
121+12:44 tight name i
122+12:45 tight glyph =
123+12:46 tight lit ~.hello
124+12:54 name t
125+12:55 tight glyph =
126+12:56 tight name x
127+12:57 tight glyph ]
128+13:1 NEWLINE
129+13:1 glyph ++
130+13:4 name qath-tail
131+13:14 glyph |=
132+13:17 name x
133+13:18 tight glyph =
134+13:19 tight name qath
135+13:24 glyph ^-
136+13:27 wing alpha.one
137+13:37 glyph [
138+13:38 tight name i
139+13:39 tight glyph =
140+13:40 tight lit ~.hello
141+13:48 name t
142+13:49 tight glyph =
143+13:50 tight name x
144+13:51 tight glyph ]
145+14:1 NEWLINE
146+14:1 glyph ++
147+14:4 name list-to-qath
148+14:17 glyph |=
149+14:20 name x
150+14:21 tight glyph =
151+14:22 tight glyph (
152+14:23 tight name list
153+14:28 aura @ta
154+14:31 tight glyph )
155+14:33 glyph ^-
156+14:36 name qath
157+14:41 name x
158+15:1 NEWLINE
159+15:1 glyph ++
160+15:4 name qath-to-list
161+15:17 glyph |=
162+15:20 name x
163+15:21 tight glyph =
164+15:22 tight name qath
165+15:27 glyph ^-
166+15:30 glyph (
167+15:31 tight name list
168+15:36 aura @ta
169+15:39 tight glyph )
170+15:41 name x
171+15:42 NEWLINE
tests/golden/types-qath-module-identity/tree.txtnew file+70
@@ -0,0 +1,70 @@
1+(module
2+ (jibb 1:1 one /ui/one)
3+ (jibb 2:1 other /ui/one)
4+ (jibb 3:1 two /ui/two)
5+ (jibb 4:1 mid /ui/mid)
6+ (value 5:1 same-origin
7+ (gate 5:16
8+ (face 5:19 x (ref 5:21 alpha.one))
9+ (group 5:31
10+ (call 5:32 (wing 5:32 identity.other) (wing 5:47 x)))))
11+ (value 6:1 same-alias
12+ (gate 6:15
13+ (face 6:18 x (ref 6:20 exported.one))
14+ (group 6:33
15+ (call 6:34 (wing 6:34 identity.other) (wing 6:49 x)))))
16+ (value 7:1 different
17+ (gate 7:14
18+ (face 7:17 x (ref 7:19 alpha.one))
19+ (group 7:29
20+ (call 7:30 (wing 7:30 identity.two) (wing 7:43 x)))))
21+ (value 8:1 transit
22+ (gate 8:12
23+ (face 8:15 x (ref 8:17 result.mid))
24+ (group 8:28
25+ (call 8:29 (wing 8:29 forward.mid) (wing 8:41 x)))))
26+ (value 9:1 prelude
27+ (gate 9:12
28+ (face 9:15 x (ref 9:17 qath))
29+ (group 9:22
30+ (call 9:23 (wing 9:23 qidentity.one) (wing 9:37 x)))))
31+ (value 10:1 public-alias
32+ (gate 10:17
33+ (face 10:20 x (ref 10:22 route.one))
34+ (group 10:32
35+ (call 10:33 (wing 10:33 forward-q.mid) (wing 10:47 x)))))
36+ (value 11:1 same-tail
37+ (gate 11:14
38+ (face 11:17 x (ref 11:19 alpha.other))
39+ (cast 11:31
40+ (ref 11:34 alpha.one)
41+ (tuple 11:44
42+ (face 11:45 i (lit 11:47 ~.hello))
43+ (face 11:55 t (wing 11:57 x))))))
44+ (value 12:1 other-tail
45+ (gate 12:15
46+ (face 12:18 x (ref 12:20 alpha.two))
47+ (cast 12:30
48+ (ref 12:33 alpha.one)
49+ (tuple 12:43
50+ (face 12:44 i (lit 12:46 ~.hello))
51+ (face 12:54 t (wing 12:56 x))))))
52+ (value 13:1 qath-tail
53+ (gate 13:14
54+ (face 13:17 x (ref 13:19 qath))
55+ (cast 13:24
56+ (ref 13:27 alpha.one)
57+ (tuple 13:37
58+ (face 13:38 i (lit 13:40 ~.hello))
59+ (face 13:48 t (wing 13:50 x))))))
60+ (value 14:1 list-to-qath
61+ (gate 14:17
62+ (face 14:20 x
63+ (apply 14:22 list (aura 14:28 @ta)))
64+ (cast 14:33 (ref 14:36 qath) (wing 14:41 x))))
65+ (value 15:1 qath-to-list
66+ (gate 15:17
67+ (face 15:20 x (ref 15:22 qath))
68+ (cast 15:27
69+ (apply 15:30 list (aura 15:36 @ta))
70+ (wing 15:41 x)))))
tests/golden/types-qath-module-identity/types.txtnew file+18
@@ -0,0 +1,18 @@
1+partial inference; module not checked
2+++ same-origin: $-(alpha.one alpha.other)
3+++ same-alias: $-(alpha.one alpha.other)
4+++ different: call's sample and argument types do not unify
5+/tests/golden/types-qath-module-identity/source.jibb:7:30: called gate has type $-(alpha.two alpha.two)
6+++ different |= x=alpha.one (identity.two x)
7+ ^
8+/tests/golden/types-qath-module-identity/source.jibb:7:43: argument has type alpha.one
9+++ different |= x=alpha.one (identity.two x)
10+ ^
11+++ transit: $-(result.mid result.mid)
12+++ prelude: $-(qath qath)
13+++ public-alias: $-(qath qath)
14+++ same-tail: $-(alpha.other alpha.one)
15+++ other-tail: recursive mold cell does not fit its source shape
16+++ qath-tail: recursive mold cell does not fit its source shape
17+++ list-to-qath: cast constraint is not supported by partial inference
18+++ qath-to-list: cast constraint is not supported by partial inference
tests/golden/types-qath-recursive/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar, Molds and Paths; Overview, Links and URLs: qath is a transparent source-defined recursive type, and application paths have that type.
2+tests: Construction, positional and named fields, nested cells, same-type identity, simple exhaustive inspection, static literals, and conservative failures for dynamic segments and incompatible heads, tails and field names. Route and static-file validation is deferred to milestone 4.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/types-qath-recursive/modules.txtnew file+1
@@ -0,0 +1 @@
1+# Use the source-backed prelude for this case.
tests/golden/types-qath-recursive/source.jibbnew file+19
@@ -0,0 +1,19 @@
1+++ empty ^- qath ~
2+++ one ^- qath [~.blog ~]
3+++ named ^- qath [i=~.blog t=~]
4+++ nested ^- qath [~.blog [~.post ~]]
5+++ identity |= x=qath x
6+++ first |= x=qath
7+ ?- x
8+ ~ ~.none
9+ [piece remainder] piece
10+++ rest |= x=qath
11+ ?- x
12+ ~ x
13+ [piece remainder] remainder
14+++ literal %/blog/post
15+++ root %/
16+++ dynamic |= slug=@ta %/blog/(slug)
17+++ bad-head ^- qath [~zod ~]
18+++ bad-tail ^- qath [~.blog ~zod]
19+++ bad-face ^- qath [wrong=~.blog t=~]
tests/golden/types-qath-recursive/tokens.txtnew file+145
@@ -0,0 +1,145 @@
1+1:1 glyph ++
2+1:4 name empty
3+1:10 glyph ^-
4+1:13 name qath
5+1:18 lit ~
6+2:1 NEWLINE
7+2:1 glyph ++
8+2:4 name one
9+2:8 glyph ^-
10+2:11 name qath
11+2:16 glyph [
12+2:17 tight lit ~.blog
13+2:24 lit ~
14+2:25 tight glyph ]
15+3:1 NEWLINE
16+3:1 glyph ++
17+3:4 name named
18+3:10 glyph ^-
19+3:13 name qath
20+3:18 glyph [
21+3:19 tight name i
22+3:20 tight glyph =
23+3:21 tight lit ~.blog
24+3:28 name t
25+3:29 tight glyph =
26+3:30 tight lit ~
27+3:31 tight glyph ]
28+4:1 NEWLINE
29+4:1 glyph ++
30+4:4 name nested
31+4:11 glyph ^-
32+4:14 name qath
33+4:19 glyph [
34+4:20 tight lit ~.blog
35+4:27 glyph [
36+4:28 tight lit ~.post
37+4:35 lit ~
38+4:36 tight glyph ]
39+4:37 tight glyph ]
40+5:1 NEWLINE
41+5:1 glyph ++
42+5:4 name identity
43+5:13 glyph |=
44+5:16 name x
45+5:17 tight glyph =
46+5:18 tight name qath
47+5:23 name x
48+6:1 NEWLINE
49+6:1 glyph ++
50+6:4 name first
51+6:10 glyph |=
52+6:13 name x
53+6:14 tight glyph =
54+6:15 tight name qath
55+7:3 INDENT
56+7:3 glyph ?-
57+7:6 name x
58+8:5 INDENT
59+8:5 lit ~
60+8:7 lit ~.none
61+9:5 NEWLINE
62+9:5 glyph [
63+9:6 tight name piece
64+9:12 name remainder
65+9:21 tight glyph ]
66+9:23 name piece
67+10:1 DEDENT
68+10:1 DEDENT
69+10:1 NEWLINE
70+10:1 glyph ++
71+10:4 name rest
72+10:9 glyph |=
73+10:12 name x
74+10:13 tight glyph =
75+10:14 tight name qath
76+11:3 INDENT
77+11:3 glyph ?-
78+11:6 name x
79+12:5 INDENT
80+12:5 lit ~
81+12:7 name x
82+13:5 NEWLINE
83+13:5 glyph [
84+13:6 tight name piece
85+13:12 name remainder
86+13:21 tight glyph ]
87+13:23 name remainder
88+14:1 DEDENT
89+14:1 DEDENT
90+14:1 NEWLINE
91+14:1 glyph ++
92+14:4 name literal
93+14:12 glyph %/
94+14:14 tight knot blog
95+14:18 tight glyph /
96+14:19 tight knot post
97+15:1 NEWLINE
98+15:1 glyph ++
99+15:4 name root
100+15:9 glyph %/
101+16:1 NEWLINE
102+16:1 glyph ++
103+16:4 name dynamic
104+16:12 glyph |=
105+16:15 name slug
106+16:19 tight glyph =
107+16:20 tight aura @ta
108+16:24 glyph %/
109+16:26 tight knot blog
110+16:30 tight glyph /
111+16:31 tight glyph (
112+16:32 tight name slug
113+16:36 tight glyph )
114+17:1 NEWLINE
115+17:1 glyph ++
116+17:4 name bad-head
117+17:13 glyph ^-
118+17:16 name qath
119+17:21 glyph [
120+17:22 tight lit ~zod
121+17:27 lit ~
122+17:28 tight glyph ]
123+18:1 NEWLINE
124+18:1 glyph ++
125+18:4 name bad-tail
126+18:13 glyph ^-
127+18:16 name qath
128+18:21 glyph [
129+18:22 tight lit ~.blog
130+18:29 lit ~zod
131+18:33 tight glyph ]
132+19:1 NEWLINE
133+19:1 glyph ++
134+19:4 name bad-face
135+19:13 glyph ^-
136+19:16 name qath
137+19:21 glyph [
138+19:22 tight name wrong
139+19:27 tight glyph =
140+19:28 tight lit ~.blog
141+19:35 name t
142+19:36 tight glyph =
143+19:37 tight lit ~
144+19:38 tight glyph ]
145+19:39 NEWLINE
tests/golden/types-qath-recursive/tree.txtnew file+63
@@ -0,0 +1,63 @@
1+(module
2+ (value 1:1 empty
3+ (cast 1:10 (ref 1:13 qath) (lit 1:18 ~)))
4+ (value 2:1 one
5+ (cast 2:8
6+ (ref 2:11 qath)
7+ (tuple 2:16 (lit 2:17 ~.blog) (lit 2:24 ~))))
8+ (value 3:1 named
9+ (cast 3:10
10+ (ref 3:13 qath)
11+ (tuple 3:18
12+ (face 3:19 i (lit 3:21 ~.blog))
13+ (face 3:28 t (lit 3:30 ~)))))
14+ (value 4:1 nested
15+ (cast 4:11
16+ (ref 4:14 qath)
17+ (tuple 4:19
18+ (lit 4:20 ~.blog)
19+ (tuple 4:27 (lit 4:28 ~.post) (lit 4:35 ~)))))
20+ (value 5:1 identity
21+ (gate 5:13
22+ (face 5:16 x (ref 5:18 qath))
23+ (wing 5:23 x)))
24+ (value 6:1 first
25+ (gate 6:10
26+ (face 6:13 x (ref 6:15 qath))
27+ (body 7:3
28+ (branch 7:3
29+ (wing 7:6 x)
30+ (arm 8:5 (lit 8:5 ~) (lit 8:7 ~.none))
31+ (arm 9:5
32+ (cell 9:5 (bind 9:6 piece) (bind 9:12 remainder))
33+ (wing 9:23 piece))))))
34+ (value 10:1 rest
35+ (gate 10:9
36+ (face 10:12 x (ref 10:14 qath))
37+ (body 11:3
38+ (branch 11:3
39+ (wing 11:6 x)
40+ (arm 12:5 (lit 12:5 ~) (wing 12:7 x))
41+ (arm 13:5
42+ (cell 13:5 (bind 13:6 piece) (bind 13:12 remainder))
43+ (wing 13:23 remainder))))))
44+ (value 14:1 literal (qath 14:12 blog post))
45+ (value 15:1 root (qath 15:9))
46+ (value 16:1 dynamic
47+ (gate 16:12
48+ (face 16:15 slug (aura 16:20 @ta))
49+ (qath 16:24 blog (wing 16:32 slug))))
50+ (value 17:1 bad-head
51+ (cast 17:13
52+ (ref 17:16 qath)
53+ (tuple 17:21 (lit 17:22 ~zod) (lit 17:27 ~))))
54+ (value 18:1 bad-tail
55+ (cast 18:13
56+ (ref 18:16 qath)
57+ (tuple 18:21 (lit 18:22 ~.blog) (lit 18:29 ~zod))))
58+ (value 19:1 bad-face
59+ (cast 19:13
60+ (ref 19:16 qath)
61+ (tuple 19:21
62+ (face 19:22 wrong (lit 19:28 ~.blog))
63+ (face 19:35 t (lit 19:37 ~))))))
tests/golden/types-qath-recursive/types.txtnew file+14
@@ -0,0 +1,14 @@
1+partial inference; module not checked
2+++ empty: qath
3+++ one: qath
4+++ named: qath
5+++ nested: qath
6+++ identity: $-(qath qath)
7+++ first: $-(qath @ta)
8+++ rest: $-(qath qath)
9+++ literal: qath
10+++ root: qath
11+++ dynamic: application path segments need unsupported inference
12+++ bad-head: recursive mold cell does not fit its source shape
13+++ bad-tail: recursive mold cell constraint needs unsupported inference
14+++ bad-face: recursive mold cell does not fit its source shape
tests/lib/jibb-qath-fuel.hoonnew file+52
@@ -0,0 +1,52 @@
1+:: Recursive qath unfolding uses bounded fuel and preserves uncertain faces.
2+/+ jibb
3+|%
4+++ qath-fuel-errors
5+ ^- (list tape)
6+ =/ typ=itype:jibb [%jrec /lib/jibb/internal/jibb %qath ~ %i %ta %t]
7+ =/ lit=expr:jibb [%lit *span:jibb [%null %n 0 '~']]
8+ =/ state=istate:jibb *istate:jibb
9+ =/ faced=itype:jibb [%face %field typ]
10+ =/ wrong=itype:jibb [%face %other typ]
11+ =/ bound=isub:jibb ~[[0 typ]]
12+ =/ checks
13+ :^ -:(infer-call-context-arg:jibb lit typ ~ state(jrec-fuel 0) *span:jibb)
14+ -:(infer-call-context-arg:jibb lit typ ~ state(jrec-fuel 1) *span:jibb)
15+ -:(infer-call-context-arg:jibb lit typ ~ state(jrec-fuel 2) *span:jibb)
16+ :~ -:(itype-fit:jibb [%var 0] faced bound 1)
17+ -:(itype-fit:jibb faced [%var 0] bound 1)
18+ -:(itype-fit:jibb typ faced ~ 1)
19+ -:(itype-fit:jibb faced typ ~ 1)
20+ -:(itype-fit:jibb faced wrong ~ 1)
21+ -:(itype-fit:jibb wrong faced ~ 1)
22+ ==
23+ ?. ?=([%| %& %& %unknown %unknown %ok %ok %bad %bad ~] checks)
24+ ~["qath null fuel or recursive face fitting failed"]
25+ =/ static-zero (qath-static-fuel:jibb ~[[%knot 'x']] 0)
26+ =/ static-one (qath-static-fuel:jibb ~[[%knot 'x']] 1)
27+ =/ static-two (qath-static-fuel:jibb ~[[%knot 'x']] 2)
28+ ?. &(=(~ static-zero) =(static-one [~ 0]) =(static-two [~ 1]))
29+ ~["qath static path fuel failed"]
30+ =/ source=@t (crip "++ nil ~\0a++ cell [i=~.hi t=~]\0a++ branch ?- x\0a ~ 0\0a [a b] 1\0a")
31+ =/ parsed=(each module:jibb error:jibb) (parse:jibb /ui/test/jibb source)
32+ ?: ?=(%| -.parsed) ~["qath fuel controls did not parse"]
33+ =/ ds=(list def:jibb) defs.p.parsed
34+ ?~ ds ~["qath fuel controls are missing definitions"]
35+ ?~ t.ds ~["qath fuel controls are missing definitions"]
36+ ?~ t.t.ds ~["qath fuel controls are missing definitions"]
37+ ?> &(?=(%value -.i.t.ds) ?=(%value -.i.t.t.ds))
38+ =/ cell=expr:jibb val.i.t.ds
39+ =/ branch=expr:jibb val.i.t.t.ds
40+ =/ cell-zero (infer-call-context-arg:jibb cell typ ~ state(jrec-fuel 0) *span:jibb)
41+ =/ cell-one (infer-call-context-arg:jibb cell typ ~ state(jrec-fuel 1) *span:jibb)
42+ =/ cell-two (infer-call-context-arg:jibb cell typ ~ state(jrec-fuel 2) *span:jibb)
43+ =/ match-zero (jrec-match-view:jibb branch [%& typ state(jrec-fuel 0)])
44+ =/ match-one (jrec-match-view:jibb branch [%& typ state(jrec-fuel 1)])
45+ =/ match-two (jrec-match-view:jibb branch [%& typ state(jrec-fuel 2)])
46+ ?. &(?=(%| -.cell-zero) ?=(%| -.cell-one) ?=(%& -.cell-two) ?=(%| -.match-zero) ?=(%& -.match-one) ?=(%& -.match-two))
47+ ~["qath cell or match fuel failed"]
48+ ~
49+++ test-qath-fuel
50+ ^- tang
51+ (turn qath-fuel-errors |=(reason=tape leaf+reason))
52+--
tests/lib/jibb-qath-source.hoonnew file+34
@@ -0,0 +1,34 @@
1+:: Source-backed qath accepts only the proven public and internal interfaces.
2+/+ jibb
3+/* real-internal %jibb /lib/jibb/internal/jibb
4+|%
5+++ check-literal-interface
6+ |= [prelude=(unit ifile:jibb) okay=?]
7+ ^- ?
8+ =/ literal=expr:jibb [%qath *span:jibb ~[[%knot 'foo']]]
9+ =/ state=istate:jibb *istate:jibb
10+ =/ out=iresult:jibb (infer-fragment:jibb literal ~ state(prelude prelude, jrec-fuel 2))
11+ ?:(okay ?=(%& -.out) ?=(%| -.out))
12+++ check-source-prelude
13+ |= [source=@t internal=@t want=@tas]
14+ ^- ?
15+ =/ prepared=(unit iprelude:jibb) (prepare-prelude-with-internal:jibb source internal)
16+ ?: =(%unprepared want) ?=(~ prepared)
17+ ?~ prepared |
18+ (check-literal-interface `iface.u.prepared =(%accept want))
19+++ qath-source-errors
20+ ^- (list tape)
21+ =/ minimal=@t '/= internal /lib/jibb/internal\0a+$ qath qath.internal\0a'
22+ =/ sources=(list [source=@t internal=@t want=@tas])
23+ :~ [minimal real-internal %accept]
24+ [minimal '' %unprepared]
25+ ['++ identity |= x x\0a' real-internal %decline]
26+ ['+$ qath @t\0a' real-internal %decline]
27+ [minimal '+$ qath @t\0a' %decline]
28+ ==
29+ ?: (levy sources |=(c=[source=@t internal=@t want=@tas] (check-source-prelude source.c internal.c want.c))) ~
30+ ~["qath source provenance guard failed"]
31+++ test-qath-source
32+ ^- tang
33+ (turn qath-source-errors |=(reason=tape leaf+reason))
34+--
tests/lib/jibb.hoon+437−409
@@ -1886,339 +1886,359 @@
18861886/* tok-528 %txt /tests/golden/types-prelude-unit-helpers/tokens/txt
18871887/* tre-528 %txt /tests/golden/types-prelude-unit-helpers/tree/txt
18881888/* typ-528 %txt /tests/golden/types-prelude-unit-helpers/types/txt
1889−/* src-529 %jibb /tests/golden/types-record-bound-variable/source/jibb
1890−/* tok-529 %txt /tests/golden/types-record-bound-variable/tokens/txt
1891−/* tre-529 %txt /tests/golden/types-record-bound-variable/tree/txt
1892−/* typ-529 %txt /tests/golden/types-record-bound-variable/types/txt
1893−/* src-530 %jibb /tests/golden/types-record-cast-context/source/jibb
1894−/* tok-530 %txt /tests/golden/types-record-cast-context/tokens/txt
1895−/* tre-530 %txt /tests/golden/types-record-cast-context/tree/txt
1896−/* typ-530 %txt /tests/golden/types-record-cast-context/types/txt
1897−/* src-531 %jibb /tests/golden/types-record-change/source/jibb
1898−/* tok-531 %txt /tests/golden/types-record-change/tokens/txt
1899−/* tre-531 %txt /tests/golden/types-record-change/tree/txt
1900−/* typ-531 %txt /tests/golden/types-record-change/types/txt
1901−/* src-532 %jibb /tests/golden/types-record-change-generic/source/jibb
1902−/* tok-532 %txt /tests/golden/types-record-change-generic/tokens/txt
1903−/* tre-532 %txt /tests/golden/types-record-change-generic/tree/txt
1904−/* typ-532 %txt /tests/golden/types-record-change-generic/types/txt
1905−/* src-533 %jibb /tests/golden/types-record-faces/source/jibb
1906−/* tok-533 %txt /tests/golden/types-record-faces/tokens/txt
1907−/* tre-533 %txt /tests/golden/types-record-faces/tree/txt
1908−/* typ-533 %txt /tests/golden/types-record-faces/types/txt
1909−/* src-534 %jibb /tests/golden/types-record-field-edit-separate/source/jibb
1910−/* tok-534 %txt /tests/golden/types-record-field-edit-separate/tokens/txt
1911−/* tre-534 %txt /tests/golden/types-record-field-edit-separate/tree/txt
1912−/* typ-534 %txt /tests/golden/types-record-field-edit-separate/types/txt
1913−/* src-535 %jibb /tests/golden/types-record-field-expr-duplicate/source/jibb
1914−/* tok-535 %txt /tests/golden/types-record-field-expr-duplicate/tokens/txt
1915−/* tre-535 %txt /tests/golden/types-record-field-expr-duplicate/tree/txt
1916−/* typ-535 %txt /tests/golden/types-record-field-expr-duplicate/types/txt
1917−/* src-536 %jibb /tests/golden/types-record-field-expr-separate/source/jibb
1918−/* tok-536 %txt /tests/golden/types-record-field-expr-separate/tokens/txt
1919−/* tre-536 %txt /tests/golden/types-record-field-expr-separate/tree/txt
1920−/* typ-536 %txt /tests/golden/types-record-field-expr-separate/types/txt
1921−/* src-537 %jibb /tests/golden/types-record-field-module-reachable/source/jibb
1922−/* tok-537 %txt /tests/golden/types-record-field-module-reachable/tokens/txt
1923−/* tre-537 %txt /tests/golden/types-record-field-module-reachable/tree/txt
1924−/* mod-537-1 %jibb /tests/golden/types-record-field-module-reachable/modules/ui/lib/jibb
1925−/* typ-537 %txt /tests/golden/types-record-field-module-reachable/types/txt
1926−/* mtre-537 %txt /tests/golden/types-record-field-module-reachable/module-trees/txt
1927−/* src-538 %jibb /tests/golden/types-record-field-module-unused/source/jibb
1928−/* tok-538 %txt /tests/golden/types-record-field-module-unused/tokens/txt
1929−/* tre-538 %txt /tests/golden/types-record-field-module-unused/tree/txt
1930−/* mod-538-1 %jibb /tests/golden/types-record-field-module-unused/modules/ui/good/jibb
1931−/* mod-538-2 %jibb /tests/golden/types-record-field-module-unused/modules/ui/unused/jibb
1932−/* typ-538 %txt /tests/golden/types-record-field-module-unused/types/txt
1933−/* mtre-538 %txt /tests/golden/types-record-field-module-unused/module-trees/txt
1934−/* src-539 %jibb /tests/golden/types-record-field-nested-mold/source/jibb
1935−/* tok-539 %txt /tests/golden/types-record-field-nested-mold/tokens/txt
1936−/* tre-539 %txt /tests/golden/types-record-field-nested-mold/tree/txt
1937−/* typ-539 %txt /tests/golden/types-record-field-nested-mold/types/txt
1938−/* src-540 %jibb /tests/golden/types-record-field-outer-inner/source/jibb
1939−/* tok-540 %txt /tests/golden/types-record-field-outer-inner/tokens/txt
1940−/* tre-540 %txt /tests/golden/types-record-field-outer-inner/tree/txt
1941−/* typ-540 %txt /tests/golden/types-record-field-outer-inner/types/txt
1942−/* src-541 %jibb /tests/golden/types-record-field-sample-duplicate/source/jibb
1943−/* tok-541 %txt /tests/golden/types-record-field-sample-duplicate/tokens/txt
1944−/* tre-541 %txt /tests/golden/types-record-field-sample-duplicate/tree/txt
1945−/* typ-541 %txt /tests/golden/types-record-field-sample-duplicate/types/txt
1946−/* src-542 %jibb /tests/golden/types-record-field-separate-molds/source/jibb
1947−/* tok-542 %txt /tests/golden/types-record-field-separate-molds/tokens/txt
1948−/* tre-542 %txt /tests/golden/types-record-field-separate-molds/tree/txt
1949−/* typ-542 %txt /tests/golden/types-record-field-separate-molds/types/txt
1950−/* src-543 %jibb /tests/golden/types-record-field-unused-mold/source/jibb
1951−/* tok-543 %txt /tests/golden/types-record-field-unused-mold/tokens/txt
1952−/* tre-543 %txt /tests/golden/types-record-field-unused-mold/tree/txt
1953−/* typ-543 %txt /tests/golden/types-record-field-unused-mold/types/txt
1954−/* src-544 %jibb /tests/golden/types-record-import/source/jibb
1955−/* tok-544 %txt /tests/golden/types-record-import/tokens/txt
1956−/* tre-544 %txt /tests/golden/types-record-import/tree/txt
1957−/* mod-544-1 %jibb /tests/golden/types-record-import/modules/ui/lib/jibb
1958−/* typ-544 %txt /tests/golden/types-record-import/types/txt
1959−/* mtre-544 %txt /tests/golden/types-record-import/module-trees/txt
1960−/* src-545 %jibb /tests/golden/types-record-local-scheme/source/jibb
1961−/* tok-545 %txt /tests/golden/types-record-local-scheme/tokens/txt
1962−/* tre-545 %txt /tests/golden/types-record-local-scheme/tree/txt
1963−/* typ-545 %txt /tests/golden/types-record-local-scheme/types/txt
1964−/* src-546 %jibb /tests/golden/types-record-nested/source/jibb
1965−/* tok-546 %txt /tests/golden/types-record-nested/tokens/txt
1966−/* tre-546 %txt /tests/golden/types-record-nested/tree/txt
1967−/* typ-546 %txt /tests/golden/types-record-nested/types/txt
1968−/* src-547 %jibb /tests/golden/types-record-to-tuple/source/jibb
1969−/* tok-547 %txt /tests/golden/types-record-to-tuple/tokens/txt
1970−/* tre-547 %txt /tests/golden/types-record-to-tuple/tree/txt
1971−/* typ-547 %txt /tests/golden/types-record-to-tuple/types/txt
1972−/* src-548 %jibb /tests/golden/types-recursion-scc-failures/source/jibb
1973−/* tok-548 %txt /tests/golden/types-recursion-scc-failures/tokens/txt
1974−/* tre-548 %txt /tests/golden/types-recursion-scc-failures/tree/txt
1975−/* typ-548 %txt /tests/golden/types-recursion-scc-failures/types/txt
1976−/* src-549 %jibb /tests/golden/types-recursion-scc-groups/source/jibb
1977−/* tok-549 %txt /tests/golden/types-recursion-scc-groups/tokens/txt
1978−/* tre-549 %txt /tests/golden/types-recursion-scc-groups/tree/txt
1979−/* typ-549 %txt /tests/golden/types-recursion-scc-groups/types/txt
1980−/* src-550 %jibb /tests/golden/types-recursion-scc-import/source/jibb
1981−/* tok-550 %txt /tests/golden/types-recursion-scc-import/tokens/txt
1982−/* tre-550 %txt /tests/golden/types-recursion-scc-import/tree/txt
1983−/* mod-550-1 %jibb /tests/golden/types-recursion-scc-import/modules/ui/lib/jibb
1984−/* typ-550 %txt /tests/golden/types-recursion-scc-import/types/txt
1985−/* mtre-550 %txt /tests/golden/types-recursion-scc-import/module-trees/txt
1986−/* src-551 %jibb /tests/golden/types-recursion-scc-import-bad/source/jibb
1987−/* tok-551 %txt /tests/golden/types-recursion-scc-import-bad/tokens/txt
1988−/* tre-551 %txt /tests/golden/types-recursion-scc-import-bad/tree/txt
1989−/* mod-551-1 %jibb /tests/golden/types-recursion-scc-import-bad/modules/ui/lib/jibb
1990−/* typ-551 %txt /tests/golden/types-recursion-scc-import-bad/types/txt
1991−/* mtre-551 %txt /tests/golden/types-recursion-scc-import-bad/module-trees/txt
1992−/* src-552 %jibb /tests/golden/types-recursion-scc-local/source/jibb
1993−/* tok-552 %txt /tests/golden/types-recursion-scc-local/tokens/txt
1994−/* tre-552 %txt /tests/golden/types-recursion-scc-local/tree/txt
1995−/* typ-552 %txt /tests/golden/types-recursion-scc-local/types/txt
1996−/* src-553 %jibb /tests/golden/types-recursion-scc-order/source/jibb
1997−/* tok-553 %txt /tests/golden/types-recursion-scc-order/tokens/txt
1998−/* tre-553 %txt /tests/golden/types-recursion-scc-order/tree/txt
1999−/* typ-553 %txt /tests/golden/types-recursion-scc-order/types/txt
2000−/* src-554 %jibb /tests/golden/types-recursion-scc-shadow/source/jibb
2001−/* tok-554 %txt /tests/golden/types-recursion-scc-shadow/tokens/txt
2002−/* tre-554 %txt /tests/golden/types-recursion-scc-shadow/tree/txt
2003−/* typ-554 %txt /tests/golden/types-recursion-scc-shadow/types/txt
2004−/* src-555 %jibb /tests/golden/types-recursive-branch/source/jibb
2005−/* tok-555 %txt /tests/golden/types-recursive-branch/tokens/txt
2006−/* tre-555 %txt /tests/golden/types-recursive-branch/tree/txt
2007−/* typ-555 %txt /tests/golden/types-recursive-branch/types/txt
2008−/* src-556 %jibb /tests/golden/types-recursive-gate/source/jibb
2009−/* tok-556 %txt /tests/golden/types-recursive-gate/tokens/txt
2010−/* tre-556 %txt /tests/golden/types-recursive-gate/tree/txt
2011−/* typ-556 %txt /tests/golden/types-recursive-gate/types/txt
2012−/* src-557 %jibb /tests/golden/types-recursive-sample/source/jibb
2013−/* tok-557 %txt /tests/golden/types-recursive-sample/tokens/txt
2014−/* tre-557 %txt /tests/golden/types-recursive-sample/tree/txt
2015−/* typ-557 %txt /tests/golden/types-recursive-sample/types/txt
2016−/* src-558 %jibb /tests/golden/types-scope-library-poke/source/jibb
2017−/* tok-558 %txt /tests/golden/types-scope-library-poke/tokens/txt
2018−/* tre-558 %txt /tests/golden/types-scope-library-poke/tree/txt
2019−/* typ-558 %txt /tests/golden/types-scope-library-poke/types/txt
2020−/* src-559 %jibb /tests/golden/types-scope-root-api/source/jibb
2021−/* tok-559 %txt /tests/golden/types-scope-root-api/tokens/txt
2022−/* tre-559 %txt /tests/golden/types-scope-root-api/tree/txt
2023−/* typ-559 %txt /tests/golden/types-scope-root-api/types/txt
2024−/* src-560 %jibb /tests/golden/types-scope-store-duplicate/source/jibb
2025−/* tok-560 %txt /tests/golden/types-scope-store-duplicate/tokens/txt
2026−/* tre-560 %txt /tests/golden/types-scope-store-duplicate/tree/txt
2027−/* typ-560 %txt /tests/golden/types-scope-store-duplicate/types/txt
2028−/* src-561 %jibb /tests/golden/types-scope-store-shadow/source/jibb
2029−/* tok-561 %txt /tests/golden/types-scope-store-shadow/tokens/txt
2030−/* tre-561 %txt /tests/golden/types-scope-store-shadow/tree/txt
2031−/* typ-561 %txt /tests/golden/types-scope-store-shadow/types/txt
2032−/* src-562 %jibb /tests/golden/types-single-case-pattern/source/jibb
2033−/* tok-562 %txt /tests/golden/types-single-case-pattern/tokens/txt
2034−/* tre-562 %txt /tests/golden/types-single-case-pattern/tree/txt
2035−/* typ-562 %txt /tests/golden/types-single-case-pattern/types/txt
2036−/* src-563 %jibb /tests/golden/types-string-interpolation/source/jibb
2037−/* tok-563 %txt /tests/golden/types-string-interpolation/tokens/txt
2038−/* tre-563 %txt /tests/golden/types-string-interpolation/tree/txt
2039−/* typ-563 %txt /tests/golden/types-string-interpolation/types/txt
2040−/* src-564 %jibb /tests/golden/types-tuple-context/source/jibb
2041−/* tok-564 %txt /tests/golden/types-tuple-context/tokens/txt
2042−/* tre-564 %txt /tests/golden/types-tuple-context/tree/txt
2043−/* typ-564 %txt /tests/golden/types-tuple-context/types/txt
2044−/* src-565 %jibb /tests/golden/types-tuple-context-nested/source/jibb
2045−/* tok-565 %txt /tests/golden/types-tuple-context-nested/tokens/txt
2046−/* tre-565 %txt /tests/golden/types-tuple-context-nested/tree/txt
2047−/* typ-565 %txt /tests/golden/types-tuple-context-nested/types/txt
2048−/* src-566 %jibb /tests/golden/types-union-alias/source/jibb
2049−/* tok-566 %txt /tests/golden/types-union-alias/tokens/txt
2050−/* tre-566 %txt /tests/golden/types-union-alias/tree/txt
2051−/* typ-566 %txt /tests/golden/types-union-alias/types/txt
2052−/* src-567 %jibb /tests/golden/types-union-branch-context/source/jibb
2053−/* tok-567 %txt /tests/golden/types-union-branch-context/tokens/txt
2054−/* tre-567 %txt /tests/golden/types-union-branch-context/tree/txt
2055−/* typ-567 %txt /tests/golden/types-union-branch-context/types/txt
2056−/* src-568 %jibb /tests/golden/types-union-branch-pending/source/jibb
2057−/* tok-568 %txt /tests/golden/types-union-branch-pending/tokens/txt
2058−/* tre-568 %txt /tests/golden/types-union-branch-pending/tree/txt
2059−/* typ-568 %txt /tests/golden/types-union-branch-pending/types/txt
2060−/* src-569 %jibb /tests/golden/types-union-constructor-shape/source/jibb
2061−/* tok-569 %txt /tests/golden/types-union-constructor-shape/tokens/txt
2062−/* tre-569 %txt /tests/golden/types-union-constructor-shape/tree/txt
2063−/* typ-569 %txt /tests/golden/types-union-constructor-shape/types/txt
2064−/* src-570 %jibb /tests/golden/types-union-context-flow/source/jibb
2065−/* tok-570 %txt /tests/golden/types-union-context-flow/tokens/txt
2066−/* tre-570 %txt /tests/golden/types-union-context-flow/tree/txt
2067−/* typ-570 %txt /tests/golden/types-union-context-flow/types/txt
2068−/* src-571 %jibb /tests/golden/types-union-finite/source/jibb
2069−/* tok-571 %txt /tests/golden/types-union-finite/tokens/txt
2070−/* tre-571 %txt /tests/golden/types-union-finite/tree/txt
2071−/* typ-571 %txt /tests/golden/types-union-finite/types/txt
2072−/* src-572 %jibb /tests/golden/types-union-finite-context/source/jibb
2073−/* tok-572 %txt /tests/golden/types-union-finite-context/tokens/txt
2074−/* tre-572 %txt /tests/golden/types-union-finite-context/tree/txt
2075−/* typ-572 %txt /tests/golden/types-union-finite-context/types/txt
2076−/* src-573 %jibb /tests/golden/types-union-finite-generic/source/jibb
2077−/* tok-573 %txt /tests/golden/types-union-finite-generic/tokens/txt
2078−/* tre-573 %txt /tests/golden/types-union-finite-generic/tree/txt
2079−/* typ-573 %txt /tests/golden/types-union-finite-generic/types/txt
2080−/* src-574 %jibb /tests/golden/types-union-finite-limit/source/jibb
2081−/* tok-574 %txt /tests/golden/types-union-finite-limit/tokens/txt
2082−/* tre-574 %txt /tests/golden/types-union-finite-limit/tree/txt
2083−/* typ-574 %txt /tests/golden/types-union-finite-limit/types/txt
2084−/* src-575 %jibb /tests/golden/types-union-import/source/jibb
2085−/* tok-575 %txt /tests/golden/types-union-import/tokens/txt
2086−/* tre-575 %txt /tests/golden/types-union-import/tree/txt
2087−/* mod-575-1 %jibb /tests/golden/types-union-import/modules/ui/lib/jibb
2088−/* typ-575 %txt /tests/golden/types-union-import/types/txt
2089−/* mtre-575 %txt /tests/golden/types-union-import/module-trees/txt
2090−/* src-576 %jibb /tests/golden/types-union-local-pending/source/jibb
2091−/* tok-576 %txt /tests/golden/types-union-local-pending/tokens/txt
2092−/* tre-576 %txt /tests/golden/types-union-local-pending/tree/txt
2093−/* typ-576 %txt /tests/golden/types-union-local-pending/types/txt
2094−/* src-577 %jibb /tests/golden/types-union-nonwing-subject/source/jibb
2095−/* tok-577 %txt /tests/golden/types-union-nonwing-subject/tokens/txt
2096−/* tre-577 %txt /tests/golden/types-union-nonwing-subject/tree/txt
2097−/* typ-577 %txt /tests/golden/types-union-nonwing-subject/types/txt
2098−/* src-578 %jibb /tests/golden/types-union-overlap/source/jibb
2099−/* tok-578 %txt /tests/golden/types-union-overlap/tokens/txt
2100−/* tre-578 %txt /tests/golden/types-union-overlap/tree/txt
2101−/* typ-578 %txt /tests/golden/types-union-overlap/types/txt
2102−/* src-579 %jibb /tests/golden/types-union-overlap-nested/source/jibb
2103−/* tok-579 %txt /tests/golden/types-union-overlap-nested/tokens/txt
2104−/* tre-579 %txt /tests/golden/types-union-overlap-nested/tree/txt
2105−/* typ-579 %txt /tests/golden/types-union-overlap-nested/types/txt
2106−/* src-580 %jibb /tests/golden/types-union-pattern-result-context/source/jibb
2107−/* tok-580 %txt /tests/golden/types-union-pattern-result-context/tokens/txt
2108−/* tre-580 %txt /tests/golden/types-union-pattern-result-context/tree/txt
2109−/* typ-580 %txt /tests/golden/types-union-pattern-result-context/types/txt
2110−/* src-581 %jibb /tests/golden/types-union-pattern-result-controls/source/jibb
2111−/* tok-581 %txt /tests/golden/types-union-pattern-result-controls/tokens/txt
2112−/* tre-581 %txt /tests/golden/types-union-pattern-result-controls/tree/txt
2113−/* typ-581 %txt /tests/golden/types-union-pattern-result-controls/types/txt
2114−/* src-582 %jibb /tests/golden/types-union-patterns/source/jibb
2115−/* tok-582 %txt /tests/golden/types-union-patterns/tokens/txt
2116−/* tre-582 %txt /tests/golden/types-union-patterns/tree/txt
2117−/* typ-582 %txt /tests/golden/types-union-patterns/types/txt
2118−/* src-583 %jibb /tests/golden/types-union-patterns-generic/source/jibb
2119−/* tok-583 %txt /tests/golden/types-union-patterns-generic/tokens/txt
2120−/* tre-583 %txt /tests/golden/types-union-patterns-generic/tree/txt
2121−/* typ-583 %txt /tests/golden/types-union-patterns-generic/types/txt
2122−/* src-584 %jibb /tests/golden/types-union-patterns-import/source/jibb
2123−/* tok-584 %txt /tests/golden/types-union-patterns-import/tokens/txt
2124−/* tre-584 %txt /tests/golden/types-union-patterns-import/tree/txt
2125−/* mod-584-1 %jibb /tests/golden/types-union-patterns-import/modules/ui/lib/jibb
2126−/* typ-584 %txt /tests/golden/types-union-patterns-import/types/txt
2127−/* mtre-584 %txt /tests/golden/types-union-patterns-import/module-trees/txt
2128−/* src-585 %jibb /tests/golden/types-union-phantom-generic/source/jibb
2129−/* tok-585 %txt /tests/golden/types-union-phantom-generic/tokens/txt
2130−/* tre-585 %txt /tests/golden/types-union-phantom-generic/tree/txt
2131−/* typ-585 %txt /tests/golden/types-union-phantom-generic/types/txt
2132−/* src-586 %jibb /tests/golden/types-union-polymorphic-identity/source/jibb
2133−/* tok-586 %txt /tests/golden/types-union-polymorphic-identity/tokens/txt
2134−/* tre-586 %txt /tests/golden/types-union-polymorphic-identity/tree/txt
2135−/* mod-586-1 %jibb /tests/golden/types-union-polymorphic-identity/modules/ui/one/jibb
2136−/* mod-586-2 %jibb /tests/golden/types-union-polymorphic-identity/modules/ui/two/jibb
2137−/* typ-586 %txt /tests/golden/types-union-polymorphic-identity/types/txt
2138−/* mtre-586 %txt /tests/golden/types-union-polymorphic-identity/module-trees/txt
2139−/* src-587 %jibb /tests/golden/types-union-print-cross-namespace/source/jibb
2140−/* tok-587 %txt /tests/golden/types-union-print-cross-namespace/tokens/txt
2141−/* tre-587 %txt /tests/golden/types-union-print-cross-namespace/tree/txt
2142−/* mod-587-1 %jibb /tests/golden/types-union-print-cross-namespace/modules/ui/lib/jibb
2143−/* typ-587 %txt /tests/golden/types-union-print-cross-namespace/types/txt
2144−/* mtre-587 %txt /tests/golden/types-union-print-cross-namespace/module-trees/txt
2145−/* src-588 %jibb /tests/golden/types-union-print-distinct/source/jibb
2146−/* tok-588 %txt /tests/golden/types-union-print-distinct/tokens/txt
2147−/* tre-588 %txt /tests/golden/types-union-print-distinct/tree/txt
2148−/* mod-588-1 %jibb /tests/golden/types-union-print-distinct/modules/ui/left/jibb
2149−/* mod-588-2 %jibb /tests/golden/types-union-print-distinct/modules/ui/right/jibb
2150−/* mod-588-3 %jibb /tests/golden/types-union-print-distinct/modules/ui/twin/jibb
2151−/* typ-588 %txt /tests/golden/types-union-print-distinct/types/txt
2152−/* mtre-588 %txt /tests/golden/types-union-print-distinct/module-trees/txt
2153−/* src-589 %jibb /tests/golden/types-union-print-escape/source/jibb
2154−/* tok-589 %txt /tests/golden/types-union-print-escape/tokens/txt
2155−/* tre-589 %txt /tests/golden/types-union-print-escape/tree/txt
2156−/* typ-589 %txt /tests/golden/types-union-print-escape/types/txt
2157−/* src-590 %jibb /tests/golden/types-union-print-local/source/jibb
2158−/* tok-590 %txt /tests/golden/types-union-print-local/tokens/txt
2159−/* tre-590 %txt /tests/golden/types-union-print-local/tree/txt
2160−/* typ-590 %txt /tests/golden/types-union-print-local/types/txt
2161−/* src-591 %jibb /tests/golden/types-union-print-nested/source/jibb
2162−/* tok-591 %txt /tests/golden/types-union-print-nested/tokens/txt
2163−/* tre-591 %txt /tests/golden/types-union-print-nested/tree/txt
2164−/* typ-591 %txt /tests/golden/types-union-print-nested/types/txt
2165−/* src-592 %jibb /tests/golden/types-union-print-same-origin/source/jibb
2166−/* tok-592 %txt /tests/golden/types-union-print-same-origin/tokens/txt
2167−/* tre-592 %txt /tests/golden/types-union-print-same-origin/tree/txt
2168−/* mod-592-1 %jibb /tests/golden/types-union-print-same-origin/modules/ui/shared/jibb
2169−/* typ-592 %txt /tests/golden/types-union-print-same-origin/types/txt
2170−/* mtre-592 %txt /tests/golden/types-union-print-same-origin/module-trees/txt
2171−/* src-593 %jibb /tests/golden/types-union-print-transitive/source/jibb
2172−/* tok-593 %txt /tests/golden/types-union-print-transitive/tokens/txt
2173−/* tre-593 %txt /tests/golden/types-union-print-transitive/tree/txt
2174−/* mod-593-1 %jibb /tests/golden/types-union-print-transitive/modules/ui/mid/jibb
2175−/* mod-593-2 %jibb /tests/golden/types-union-print-transitive/modules/ui/base/jibb
2176−/* typ-593 %txt /tests/golden/types-union-print-transitive/types/txt
2177−/* mtre-593 %txt /tests/golden/types-union-print-transitive/module-trees/txt
2178−/* src-594 %jibb /tests/golden/types-union-singleton/source/jibb
2179−/* tok-594 %txt /tests/golden/types-union-singleton/tokens/txt
2180−/* tre-594 %txt /tests/golden/types-union-singleton/tree/txt
2181−/* typ-594 %txt /tests/golden/types-union-singleton/types/txt
2182−/* src-595 %jibb /tests/golden/types-union-tag-atoms/source/jibb
2183−/* tok-595 %txt /tests/golden/types-union-tag-atoms/tokens/txt
2184−/* tre-595 %txt /tests/golden/types-union-tag-atoms/tree/txt
2185−/* typ-595 %txt /tests/golden/types-union-tag-atoms/types/txt
2186−/* src-596 %jibb /tests/golden/types-union-tags/source/jibb
2187−/* tok-596 %txt /tests/golden/types-union-tags/tokens/txt
2188−/* tre-596 %txt /tests/golden/types-union-tags/tree/txt
2189−/* typ-596 %txt /tests/golden/types-union-tags/types/txt
2190−/* src-597 %jibb /tests/golden/types-union-unresolved/source/jibb
2191−/* tok-597 %txt /tests/golden/types-union-unresolved/tokens/txt
2192−/* tre-597 %txt /tests/golden/types-union-unresolved/tree/txt
2193−/* typ-597 %txt /tests/golden/types-union-unresolved/types/txt
2194−/* src-598 %jibb /tests/golden/types-union-unresolved-flow/source/jibb
2195−/* tok-598 %txt /tests/golden/types-union-unresolved-flow/tokens/txt
2196−/* tre-598 %txt /tests/golden/types-union-unresolved-flow/tree/txt
2197−/* typ-598 %txt /tests/golden/types-union-unresolved-flow/types/txt
2198−/* src-599 %jibb /tests/golden/types-unit-construction/source/jibb
2199−/* tok-599 %txt /tests/golden/types-unit-construction/tokens/txt
2200−/* tre-599 %txt /tests/golden/types-unit-construction/tree/txt
2201−/* typ-599 %txt /tests/golden/types-unit-construction/types/txt
2202−/* src-600 %jibb /tests/golden/types-unit-context/source/jibb
2203−/* tok-600 %txt /tests/golden/types-unit-context/tokens/txt
2204−/* tre-600 %txt /tests/golden/types-unit-context/tree/txt
2205−/* typ-600 %txt /tests/golden/types-unit-context/types/txt
2206−/* src-601 %jibb /tests/golden/types-unit-patterns/source/jibb
2207−/* tok-601 %txt /tests/golden/types-unit-patterns/tokens/txt
2208−/* tre-601 %txt /tests/golden/types-unit-patterns/tree/txt
2209−/* typ-601 %txt /tests/golden/types-unit-patterns/types/txt
2210−/* src-602 %jibb /tests/golden/types-value-cycle-shadow/source/jibb
2211−/* tok-602 %txt /tests/golden/types-value-cycle-shadow/tokens/txt
2212−/* tre-602 %txt /tests/golden/types-value-cycle-shadow/tree/txt
2213−/* typ-602 %txt /tests/golden/types-value-cycle-shadow/types/txt
2214−/* src-603 %jibb /tests/golden/types-value-cycle-unsupported/source/jibb
2215−/* tok-603 %txt /tests/golden/types-value-cycle-unsupported/tokens/txt
2216−/* tre-603 %txt /tests/golden/types-value-cycle-unsupported/tree/txt
2217−/* typ-603 %txt /tests/golden/types-value-cycle-unsupported/types/txt
2218−/* src-604 %jibb /tests/golden/types-value-cycles/source/jibb
2219−/* tok-604 %txt /tests/golden/types-value-cycles/tokens/txt
2220−/* tre-604 %txt /tests/golden/types-value-cycles/tree/txt
2221−/* typ-604 %txt /tests/golden/types-value-cycles/types/txt
1889+/* src-529 %jibb /tests/golden/types-qath-faces/source/jibb
1890+/* tok-529 %txt /tests/golden/types-qath-faces/tokens/txt
1891+/* tre-529 %txt /tests/golden/types-qath-faces/tree/txt
1892+/* typ-529 %txt /tests/golden/types-qath-faces/types/txt
1893+/* src-530 %jibb /tests/golden/types-qath-holes/source/jibb
1894+/* tok-530 %txt /tests/golden/types-qath-holes/tokens/txt
1895+/* tre-530 %txt /tests/golden/types-qath-holes/tree/txt
1896+/* typ-530 %txt /tests/golden/types-qath-holes/types/txt
1897+/* src-531 %jibb /tests/golden/types-qath-module-identity/source/jibb
1898+/* tok-531 %txt /tests/golden/types-qath-module-identity/tokens/txt
1899+/* tre-531 %txt /tests/golden/types-qath-module-identity/tree/txt
1900+/* mod-531-1 %jibb /tests/golden/types-qath-module-identity/modules/ui/one/jibb
1901+/* mod-531-2 %jibb /tests/golden/types-qath-module-identity/modules/ui/two/jibb
1902+/* mod-531-3 %jibb /tests/golden/types-qath-module-identity/modules/ui/mid/jibb
1903+/* typ-531 %txt /tests/golden/types-qath-module-identity/types/txt
1904+/* mtre-531 %txt /tests/golden/types-qath-module-identity/module-trees/txt
1905+/* src-532 %jibb /tests/golden/types-qath-recursive/source/jibb
1906+/* tok-532 %txt /tests/golden/types-qath-recursive/tokens/txt
1907+/* tre-532 %txt /tests/golden/types-qath-recursive/tree/txt
1908+/* typ-532 %txt /tests/golden/types-qath-recursive/types/txt
1909+/* src-533 %jibb /tests/golden/types-record-bound-variable/source/jibb
1910+/* tok-533 %txt /tests/golden/types-record-bound-variable/tokens/txt
1911+/* tre-533 %txt /tests/golden/types-record-bound-variable/tree/txt
1912+/* typ-533 %txt /tests/golden/types-record-bound-variable/types/txt
1913+/* src-534 %jibb /tests/golden/types-record-cast-context/source/jibb
1914+/* tok-534 %txt /tests/golden/types-record-cast-context/tokens/txt
1915+/* tre-534 %txt /tests/golden/types-record-cast-context/tree/txt
1916+/* typ-534 %txt /tests/golden/types-record-cast-context/types/txt
1917+/* src-535 %jibb /tests/golden/types-record-change/source/jibb
1918+/* tok-535 %txt /tests/golden/types-record-change/tokens/txt
1919+/* tre-535 %txt /tests/golden/types-record-change/tree/txt
1920+/* typ-535 %txt /tests/golden/types-record-change/types/txt
1921+/* src-536 %jibb /tests/golden/types-record-change-generic/source/jibb
1922+/* tok-536 %txt /tests/golden/types-record-change-generic/tokens/txt
1923+/* tre-536 %txt /tests/golden/types-record-change-generic/tree/txt
1924+/* typ-536 %txt /tests/golden/types-record-change-generic/types/txt
1925+/* src-537 %jibb /tests/golden/types-record-faces/source/jibb
1926+/* tok-537 %txt /tests/golden/types-record-faces/tokens/txt
1927+/* tre-537 %txt /tests/golden/types-record-faces/tree/txt
1928+/* typ-537 %txt /tests/golden/types-record-faces/types/txt
1929+/* src-538 %jibb /tests/golden/types-record-field-edit-separate/source/jibb
1930+/* tok-538 %txt /tests/golden/types-record-field-edit-separate/tokens/txt
1931+/* tre-538 %txt /tests/golden/types-record-field-edit-separate/tree/txt
1932+/* typ-538 %txt /tests/golden/types-record-field-edit-separate/types/txt
1933+/* src-539 %jibb /tests/golden/types-record-field-expr-duplicate/source/jibb
1934+/* tok-539 %txt /tests/golden/types-record-field-expr-duplicate/tokens/txt
1935+/* tre-539 %txt /tests/golden/types-record-field-expr-duplicate/tree/txt
1936+/* typ-539 %txt /tests/golden/types-record-field-expr-duplicate/types/txt
1937+/* src-540 %jibb /tests/golden/types-record-field-expr-separate/source/jibb
1938+/* tok-540 %txt /tests/golden/types-record-field-expr-separate/tokens/txt
1939+/* tre-540 %txt /tests/golden/types-record-field-expr-separate/tree/txt
1940+/* typ-540 %txt /tests/golden/types-record-field-expr-separate/types/txt
1941+/* src-541 %jibb /tests/golden/types-record-field-module-reachable/source/jibb
1942+/* tok-541 %txt /tests/golden/types-record-field-module-reachable/tokens/txt
1943+/* tre-541 %txt /tests/golden/types-record-field-module-reachable/tree/txt
1944+/* mod-541-1 %jibb /tests/golden/types-record-field-module-reachable/modules/ui/lib/jibb
1945+/* typ-541 %txt /tests/golden/types-record-field-module-reachable/types/txt
1946+/* mtre-541 %txt /tests/golden/types-record-field-module-reachable/module-trees/txt
1947+/* src-542 %jibb /tests/golden/types-record-field-module-unused/source/jibb
1948+/* tok-542 %txt /tests/golden/types-record-field-module-unused/tokens/txt
1949+/* tre-542 %txt /tests/golden/types-record-field-module-unused/tree/txt
1950+/* mod-542-1 %jibb /tests/golden/types-record-field-module-unused/modules/ui/good/jibb
1951+/* mod-542-2 %jibb /tests/golden/types-record-field-module-unused/modules/ui/unused/jibb
1952+/* typ-542 %txt /tests/golden/types-record-field-module-unused/types/txt
1953+/* mtre-542 %txt /tests/golden/types-record-field-module-unused/module-trees/txt
1954+/* src-543 %jibb /tests/golden/types-record-field-nested-mold/source/jibb
1955+/* tok-543 %txt /tests/golden/types-record-field-nested-mold/tokens/txt
1956+/* tre-543 %txt /tests/golden/types-record-field-nested-mold/tree/txt
1957+/* typ-543 %txt /tests/golden/types-record-field-nested-mold/types/txt
1958+/* src-544 %jibb /tests/golden/types-record-field-outer-inner/source/jibb
1959+/* tok-544 %txt /tests/golden/types-record-field-outer-inner/tokens/txt
1960+/* tre-544 %txt /tests/golden/types-record-field-outer-inner/tree/txt
1961+/* typ-544 %txt /tests/golden/types-record-field-outer-inner/types/txt
1962+/* src-545 %jibb /tests/golden/types-record-field-sample-duplicate/source/jibb
1963+/* tok-545 %txt /tests/golden/types-record-field-sample-duplicate/tokens/txt
1964+/* tre-545 %txt /tests/golden/types-record-field-sample-duplicate/tree/txt
1965+/* typ-545 %txt /tests/golden/types-record-field-sample-duplicate/types/txt
1966+/* src-546 %jibb /tests/golden/types-record-field-separate-molds/source/jibb
1967+/* tok-546 %txt /tests/golden/types-record-field-separate-molds/tokens/txt
1968+/* tre-546 %txt /tests/golden/types-record-field-separate-molds/tree/txt
1969+/* typ-546 %txt /tests/golden/types-record-field-separate-molds/types/txt
1970+/* src-547 %jibb /tests/golden/types-record-field-unused-mold/source/jibb
1971+/* tok-547 %txt /tests/golden/types-record-field-unused-mold/tokens/txt
1972+/* tre-547 %txt /tests/golden/types-record-field-unused-mold/tree/txt
1973+/* typ-547 %txt /tests/golden/types-record-field-unused-mold/types/txt
1974+/* src-548 %jibb /tests/golden/types-record-import/source/jibb
1975+/* tok-548 %txt /tests/golden/types-record-import/tokens/txt
1976+/* tre-548 %txt /tests/golden/types-record-import/tree/txt
1977+/* mod-548-1 %jibb /tests/golden/types-record-import/modules/ui/lib/jibb
1978+/* typ-548 %txt /tests/golden/types-record-import/types/txt
1979+/* mtre-548 %txt /tests/golden/types-record-import/module-trees/txt
1980+/* src-549 %jibb /tests/golden/types-record-local-scheme/source/jibb
1981+/* tok-549 %txt /tests/golden/types-record-local-scheme/tokens/txt
1982+/* tre-549 %txt /tests/golden/types-record-local-scheme/tree/txt
1983+/* typ-549 %txt /tests/golden/types-record-local-scheme/types/txt
1984+/* src-550 %jibb /tests/golden/types-record-nested/source/jibb
1985+/* tok-550 %txt /tests/golden/types-record-nested/tokens/txt
1986+/* tre-550 %txt /tests/golden/types-record-nested/tree/txt
1987+/* typ-550 %txt /tests/golden/types-record-nested/types/txt
1988+/* src-551 %jibb /tests/golden/types-record-to-tuple/source/jibb
1989+/* tok-551 %txt /tests/golden/types-record-to-tuple/tokens/txt
1990+/* tre-551 %txt /tests/golden/types-record-to-tuple/tree/txt
1991+/* typ-551 %txt /tests/golden/types-record-to-tuple/types/txt
1992+/* src-552 %jibb /tests/golden/types-recursion-scc-failures/source/jibb
1993+/* tok-552 %txt /tests/golden/types-recursion-scc-failures/tokens/txt
1994+/* tre-552 %txt /tests/golden/types-recursion-scc-failures/tree/txt
1995+/* typ-552 %txt /tests/golden/types-recursion-scc-failures/types/txt
1996+/* src-553 %jibb /tests/golden/types-recursion-scc-groups/source/jibb
1997+/* tok-553 %txt /tests/golden/types-recursion-scc-groups/tokens/txt
1998+/* tre-553 %txt /tests/golden/types-recursion-scc-groups/tree/txt
1999+/* typ-553 %txt /tests/golden/types-recursion-scc-groups/types/txt
2000+/* src-554 %jibb /tests/golden/types-recursion-scc-import/source/jibb
2001+/* tok-554 %txt /tests/golden/types-recursion-scc-import/tokens/txt
2002+/* tre-554 %txt /tests/golden/types-recursion-scc-import/tree/txt
2003+/* mod-554-1 %jibb /tests/golden/types-recursion-scc-import/modules/ui/lib/jibb
2004+/* typ-554 %txt /tests/golden/types-recursion-scc-import/types/txt
2005+/* mtre-554 %txt /tests/golden/types-recursion-scc-import/module-trees/txt
2006+/* src-555 %jibb /tests/golden/types-recursion-scc-import-bad/source/jibb
2007+/* tok-555 %txt /tests/golden/types-recursion-scc-import-bad/tokens/txt
2008+/* tre-555 %txt /tests/golden/types-recursion-scc-import-bad/tree/txt
2009+/* mod-555-1 %jibb /tests/golden/types-recursion-scc-import-bad/modules/ui/lib/jibb
2010+/* typ-555 %txt /tests/golden/types-recursion-scc-import-bad/types/txt
2011+/* mtre-555 %txt /tests/golden/types-recursion-scc-import-bad/module-trees/txt
2012+/* src-556 %jibb /tests/golden/types-recursion-scc-local/source/jibb
2013+/* tok-556 %txt /tests/golden/types-recursion-scc-local/tokens/txt
2014+/* tre-556 %txt /tests/golden/types-recursion-scc-local/tree/txt
2015+/* typ-556 %txt /tests/golden/types-recursion-scc-local/types/txt
2016+/* src-557 %jibb /tests/golden/types-recursion-scc-order/source/jibb
2017+/* tok-557 %txt /tests/golden/types-recursion-scc-order/tokens/txt
2018+/* tre-557 %txt /tests/golden/types-recursion-scc-order/tree/txt
2019+/* typ-557 %txt /tests/golden/types-recursion-scc-order/types/txt
2020+/* src-558 %jibb /tests/golden/types-recursion-scc-shadow/source/jibb
2021+/* tok-558 %txt /tests/golden/types-recursion-scc-shadow/tokens/txt
2022+/* tre-558 %txt /tests/golden/types-recursion-scc-shadow/tree/txt
2023+/* typ-558 %txt /tests/golden/types-recursion-scc-shadow/types/txt
2024+/* src-559 %jibb /tests/golden/types-recursive-branch/source/jibb
2025+/* tok-559 %txt /tests/golden/types-recursive-branch/tokens/txt
2026+/* tre-559 %txt /tests/golden/types-recursive-branch/tree/txt
2027+/* typ-559 %txt /tests/golden/types-recursive-branch/types/txt
2028+/* src-560 %jibb /tests/golden/types-recursive-gate/source/jibb
2029+/* tok-560 %txt /tests/golden/types-recursive-gate/tokens/txt
2030+/* tre-560 %txt /tests/golden/types-recursive-gate/tree/txt
2031+/* typ-560 %txt /tests/golden/types-recursive-gate/types/txt
2032+/* src-561 %jibb /tests/golden/types-recursive-sample/source/jibb
2033+/* tok-561 %txt /tests/golden/types-recursive-sample/tokens/txt
2034+/* tre-561 %txt /tests/golden/types-recursive-sample/tree/txt
2035+/* typ-561 %txt /tests/golden/types-recursive-sample/types/txt
2036+/* src-562 %jibb /tests/golden/types-scope-library-poke/source/jibb
2037+/* tok-562 %txt /tests/golden/types-scope-library-poke/tokens/txt
2038+/* tre-562 %txt /tests/golden/types-scope-library-poke/tree/txt
2039+/* typ-562 %txt /tests/golden/types-scope-library-poke/types/txt
2040+/* src-563 %jibb /tests/golden/types-scope-root-api/source/jibb
2041+/* tok-563 %txt /tests/golden/types-scope-root-api/tokens/txt
2042+/* tre-563 %txt /tests/golden/types-scope-root-api/tree/txt
2043+/* typ-563 %txt /tests/golden/types-scope-root-api/types/txt
2044+/* src-564 %jibb /tests/golden/types-scope-store-duplicate/source/jibb
2045+/* tok-564 %txt /tests/golden/types-scope-store-duplicate/tokens/txt
2046+/* tre-564 %txt /tests/golden/types-scope-store-duplicate/tree/txt
2047+/* typ-564 %txt /tests/golden/types-scope-store-duplicate/types/txt
2048+/* src-565 %jibb /tests/golden/types-scope-store-shadow/source/jibb
2049+/* tok-565 %txt /tests/golden/types-scope-store-shadow/tokens/txt
2050+/* tre-565 %txt /tests/golden/types-scope-store-shadow/tree/txt
2051+/* typ-565 %txt /tests/golden/types-scope-store-shadow/types/txt
2052+/* src-566 %jibb /tests/golden/types-single-case-pattern/source/jibb
2053+/* tok-566 %txt /tests/golden/types-single-case-pattern/tokens/txt
2054+/* tre-566 %txt /tests/golden/types-single-case-pattern/tree/txt
2055+/* typ-566 %txt /tests/golden/types-single-case-pattern/types/txt
2056+/* src-567 %jibb /tests/golden/types-string-interpolation/source/jibb
2057+/* tok-567 %txt /tests/golden/types-string-interpolation/tokens/txt
2058+/* tre-567 %txt /tests/golden/types-string-interpolation/tree/txt
2059+/* typ-567 %txt /tests/golden/types-string-interpolation/types/txt
2060+/* src-568 %jibb /tests/golden/types-tuple-context/source/jibb
2061+/* tok-568 %txt /tests/golden/types-tuple-context/tokens/txt
2062+/* tre-568 %txt /tests/golden/types-tuple-context/tree/txt
2063+/* typ-568 %txt /tests/golden/types-tuple-context/types/txt
2064+/* src-569 %jibb /tests/golden/types-tuple-context-nested/source/jibb
2065+/* tok-569 %txt /tests/golden/types-tuple-context-nested/tokens/txt
2066+/* tre-569 %txt /tests/golden/types-tuple-context-nested/tree/txt
2067+/* typ-569 %txt /tests/golden/types-tuple-context-nested/types/txt
2068+/* src-570 %jibb /tests/golden/types-union-alias/source/jibb
2069+/* tok-570 %txt /tests/golden/types-union-alias/tokens/txt
2070+/* tre-570 %txt /tests/golden/types-union-alias/tree/txt
2071+/* typ-570 %txt /tests/golden/types-union-alias/types/txt
2072+/* src-571 %jibb /tests/golden/types-union-branch-context/source/jibb
2073+/* tok-571 %txt /tests/golden/types-union-branch-context/tokens/txt
2074+/* tre-571 %txt /tests/golden/types-union-branch-context/tree/txt
2075+/* typ-571 %txt /tests/golden/types-union-branch-context/types/txt
2076+/* src-572 %jibb /tests/golden/types-union-branch-pending/source/jibb
2077+/* tok-572 %txt /tests/golden/types-union-branch-pending/tokens/txt
2078+/* tre-572 %txt /tests/golden/types-union-branch-pending/tree/txt
2079+/* typ-572 %txt /tests/golden/types-union-branch-pending/types/txt
2080+/* src-573 %jibb /tests/golden/types-union-constructor-shape/source/jibb
2081+/* tok-573 %txt /tests/golden/types-union-constructor-shape/tokens/txt
2082+/* tre-573 %txt /tests/golden/types-union-constructor-shape/tree/txt
2083+/* typ-573 %txt /tests/golden/types-union-constructor-shape/types/txt
2084+/* src-574 %jibb /tests/golden/types-union-context-flow/source/jibb
2085+/* tok-574 %txt /tests/golden/types-union-context-flow/tokens/txt
2086+/* tre-574 %txt /tests/golden/types-union-context-flow/tree/txt
2087+/* typ-574 %txt /tests/golden/types-union-context-flow/types/txt
2088+/* src-575 %jibb /tests/golden/types-union-finite/source/jibb
2089+/* tok-575 %txt /tests/golden/types-union-finite/tokens/txt
2090+/* tre-575 %txt /tests/golden/types-union-finite/tree/txt
2091+/* typ-575 %txt /tests/golden/types-union-finite/types/txt
2092+/* src-576 %jibb /tests/golden/types-union-finite-context/source/jibb
2093+/* tok-576 %txt /tests/golden/types-union-finite-context/tokens/txt
2094+/* tre-576 %txt /tests/golden/types-union-finite-context/tree/txt
2095+/* typ-576 %txt /tests/golden/types-union-finite-context/types/txt
2096+/* src-577 %jibb /tests/golden/types-union-finite-generic/source/jibb
2097+/* tok-577 %txt /tests/golden/types-union-finite-generic/tokens/txt
2098+/* tre-577 %txt /tests/golden/types-union-finite-generic/tree/txt
2099+/* typ-577 %txt /tests/golden/types-union-finite-generic/types/txt
2100+/* src-578 %jibb /tests/golden/types-union-finite-limit/source/jibb
2101+/* tok-578 %txt /tests/golden/types-union-finite-limit/tokens/txt
2102+/* tre-578 %txt /tests/golden/types-union-finite-limit/tree/txt
2103+/* typ-578 %txt /tests/golden/types-union-finite-limit/types/txt
2104+/* src-579 %jibb /tests/golden/types-union-import/source/jibb
2105+/* tok-579 %txt /tests/golden/types-union-import/tokens/txt
2106+/* tre-579 %txt /tests/golden/types-union-import/tree/txt
2107+/* mod-579-1 %jibb /tests/golden/types-union-import/modules/ui/lib/jibb
2108+/* typ-579 %txt /tests/golden/types-union-import/types/txt
2109+/* mtre-579 %txt /tests/golden/types-union-import/module-trees/txt
2110+/* src-580 %jibb /tests/golden/types-union-local-pending/source/jibb
2111+/* tok-580 %txt /tests/golden/types-union-local-pending/tokens/txt
2112+/* tre-580 %txt /tests/golden/types-union-local-pending/tree/txt
2113+/* typ-580 %txt /tests/golden/types-union-local-pending/types/txt
2114+/* src-581 %jibb /tests/golden/types-union-nonwing-subject/source/jibb
2115+/* tok-581 %txt /tests/golden/types-union-nonwing-subject/tokens/txt
2116+/* tre-581 %txt /tests/golden/types-union-nonwing-subject/tree/txt
2117+/* typ-581 %txt /tests/golden/types-union-nonwing-subject/types/txt
2118+/* src-582 %jibb /tests/golden/types-union-overlap/source/jibb
2119+/* tok-582 %txt /tests/golden/types-union-overlap/tokens/txt
2120+/* tre-582 %txt /tests/golden/types-union-overlap/tree/txt
2121+/* typ-582 %txt /tests/golden/types-union-overlap/types/txt
2122+/* src-583 %jibb /tests/golden/types-union-overlap-nested/source/jibb
2123+/* tok-583 %txt /tests/golden/types-union-overlap-nested/tokens/txt
2124+/* tre-583 %txt /tests/golden/types-union-overlap-nested/tree/txt
2125+/* typ-583 %txt /tests/golden/types-union-overlap-nested/types/txt
2126+/* src-584 %jibb /tests/golden/types-union-pattern-result-context/source/jibb
2127+/* tok-584 %txt /tests/golden/types-union-pattern-result-context/tokens/txt
2128+/* tre-584 %txt /tests/golden/types-union-pattern-result-context/tree/txt
2129+/* typ-584 %txt /tests/golden/types-union-pattern-result-context/types/txt
2130+/* src-585 %jibb /tests/golden/types-union-pattern-result-controls/source/jibb
2131+/* tok-585 %txt /tests/golden/types-union-pattern-result-controls/tokens/txt
2132+/* tre-585 %txt /tests/golden/types-union-pattern-result-controls/tree/txt
2133+/* typ-585 %txt /tests/golden/types-union-pattern-result-controls/types/txt
2134+/* src-586 %jibb /tests/golden/types-union-patterns/source/jibb
2135+/* tok-586 %txt /tests/golden/types-union-patterns/tokens/txt
2136+/* tre-586 %txt /tests/golden/types-union-patterns/tree/txt
2137+/* typ-586 %txt /tests/golden/types-union-patterns/types/txt
2138+/* src-587 %jibb /tests/golden/types-union-patterns-generic/source/jibb
2139+/* tok-587 %txt /tests/golden/types-union-patterns-generic/tokens/txt
2140+/* tre-587 %txt /tests/golden/types-union-patterns-generic/tree/txt
2141+/* typ-587 %txt /tests/golden/types-union-patterns-generic/types/txt
2142+/* src-588 %jibb /tests/golden/types-union-patterns-import/source/jibb
2143+/* tok-588 %txt /tests/golden/types-union-patterns-import/tokens/txt
2144+/* tre-588 %txt /tests/golden/types-union-patterns-import/tree/txt
2145+/* mod-588-1 %jibb /tests/golden/types-union-patterns-import/modules/ui/lib/jibb
2146+/* typ-588 %txt /tests/golden/types-union-patterns-import/types/txt
2147+/* mtre-588 %txt /tests/golden/types-union-patterns-import/module-trees/txt
2148+/* src-589 %jibb /tests/golden/types-union-phantom-generic/source/jibb
2149+/* tok-589 %txt /tests/golden/types-union-phantom-generic/tokens/txt
2150+/* tre-589 %txt /tests/golden/types-union-phantom-generic/tree/txt
2151+/* typ-589 %txt /tests/golden/types-union-phantom-generic/types/txt
2152+/* src-590 %jibb /tests/golden/types-union-polymorphic-identity/source/jibb
2153+/* tok-590 %txt /tests/golden/types-union-polymorphic-identity/tokens/txt
2154+/* tre-590 %txt /tests/golden/types-union-polymorphic-identity/tree/txt
2155+/* mod-590-1 %jibb /tests/golden/types-union-polymorphic-identity/modules/ui/one/jibb
2156+/* mod-590-2 %jibb /tests/golden/types-union-polymorphic-identity/modules/ui/two/jibb
2157+/* typ-590 %txt /tests/golden/types-union-polymorphic-identity/types/txt
2158+/* mtre-590 %txt /tests/golden/types-union-polymorphic-identity/module-trees/txt
2159+/* src-591 %jibb /tests/golden/types-union-print-cross-namespace/source/jibb
2160+/* tok-591 %txt /tests/golden/types-union-print-cross-namespace/tokens/txt
2161+/* tre-591 %txt /tests/golden/types-union-print-cross-namespace/tree/txt
2162+/* mod-591-1 %jibb /tests/golden/types-union-print-cross-namespace/modules/ui/lib/jibb
2163+/* typ-591 %txt /tests/golden/types-union-print-cross-namespace/types/txt
2164+/* mtre-591 %txt /tests/golden/types-union-print-cross-namespace/module-trees/txt
2165+/* src-592 %jibb /tests/golden/types-union-print-distinct/source/jibb
2166+/* tok-592 %txt /tests/golden/types-union-print-distinct/tokens/txt
2167+/* tre-592 %txt /tests/golden/types-union-print-distinct/tree/txt
2168+/* mod-592-1 %jibb /tests/golden/types-union-print-distinct/modules/ui/left/jibb
2169+/* mod-592-2 %jibb /tests/golden/types-union-print-distinct/modules/ui/right/jibb
2170+/* mod-592-3 %jibb /tests/golden/types-union-print-distinct/modules/ui/twin/jibb
2171+/* typ-592 %txt /tests/golden/types-union-print-distinct/types/txt
2172+/* mtre-592 %txt /tests/golden/types-union-print-distinct/module-trees/txt
2173+/* src-593 %jibb /tests/golden/types-union-print-escape/source/jibb
2174+/* tok-593 %txt /tests/golden/types-union-print-escape/tokens/txt
2175+/* tre-593 %txt /tests/golden/types-union-print-escape/tree/txt
2176+/* typ-593 %txt /tests/golden/types-union-print-escape/types/txt
2177+/* src-594 %jibb /tests/golden/types-union-print-local/source/jibb
2178+/* tok-594 %txt /tests/golden/types-union-print-local/tokens/txt
2179+/* tre-594 %txt /tests/golden/types-union-print-local/tree/txt
2180+/* typ-594 %txt /tests/golden/types-union-print-local/types/txt
2181+/* src-595 %jibb /tests/golden/types-union-print-nested/source/jibb
2182+/* tok-595 %txt /tests/golden/types-union-print-nested/tokens/txt
2183+/* tre-595 %txt /tests/golden/types-union-print-nested/tree/txt
2184+/* typ-595 %txt /tests/golden/types-union-print-nested/types/txt
2185+/* src-596 %jibb /tests/golden/types-union-print-same-origin/source/jibb
2186+/* tok-596 %txt /tests/golden/types-union-print-same-origin/tokens/txt
2187+/* tre-596 %txt /tests/golden/types-union-print-same-origin/tree/txt
2188+/* mod-596-1 %jibb /tests/golden/types-union-print-same-origin/modules/ui/shared/jibb
2189+/* typ-596 %txt /tests/golden/types-union-print-same-origin/types/txt
2190+/* mtre-596 %txt /tests/golden/types-union-print-same-origin/module-trees/txt
2191+/* src-597 %jibb /tests/golden/types-union-print-transitive/source/jibb
2192+/* tok-597 %txt /tests/golden/types-union-print-transitive/tokens/txt
2193+/* tre-597 %txt /tests/golden/types-union-print-transitive/tree/txt
2194+/* mod-597-1 %jibb /tests/golden/types-union-print-transitive/modules/ui/mid/jibb
2195+/* mod-597-2 %jibb /tests/golden/types-union-print-transitive/modules/ui/base/jibb
2196+/* typ-597 %txt /tests/golden/types-union-print-transitive/types/txt
2197+/* mtre-597 %txt /tests/golden/types-union-print-transitive/module-trees/txt
2198+/* src-598 %jibb /tests/golden/types-union-singleton/source/jibb
2199+/* tok-598 %txt /tests/golden/types-union-singleton/tokens/txt
2200+/* tre-598 %txt /tests/golden/types-union-singleton/tree/txt
2201+/* typ-598 %txt /tests/golden/types-union-singleton/types/txt
2202+/* src-599 %jibb /tests/golden/types-union-tag-atoms/source/jibb
2203+/* tok-599 %txt /tests/golden/types-union-tag-atoms/tokens/txt
2204+/* tre-599 %txt /tests/golden/types-union-tag-atoms/tree/txt
2205+/* typ-599 %txt /tests/golden/types-union-tag-atoms/types/txt
2206+/* src-600 %jibb /tests/golden/types-union-tags/source/jibb
2207+/* tok-600 %txt /tests/golden/types-union-tags/tokens/txt
2208+/* tre-600 %txt /tests/golden/types-union-tags/tree/txt
2209+/* typ-600 %txt /tests/golden/types-union-tags/types/txt
2210+/* src-601 %jibb /tests/golden/types-union-unresolved/source/jibb
2211+/* tok-601 %txt /tests/golden/types-union-unresolved/tokens/txt
2212+/* tre-601 %txt /tests/golden/types-union-unresolved/tree/txt
2213+/* typ-601 %txt /tests/golden/types-union-unresolved/types/txt
2214+/* src-602 %jibb /tests/golden/types-union-unresolved-flow/source/jibb
2215+/* tok-602 %txt /tests/golden/types-union-unresolved-flow/tokens/txt
2216+/* tre-602 %txt /tests/golden/types-union-unresolved-flow/tree/txt
2217+/* typ-602 %txt /tests/golden/types-union-unresolved-flow/types/txt
2218+/* src-603 %jibb /tests/golden/types-unit-construction/source/jibb
2219+/* tok-603 %txt /tests/golden/types-unit-construction/tokens/txt
2220+/* tre-603 %txt /tests/golden/types-unit-construction/tree/txt
2221+/* typ-603 %txt /tests/golden/types-unit-construction/types/txt
2222+/* src-604 %jibb /tests/golden/types-unit-context/source/jibb
2223+/* tok-604 %txt /tests/golden/types-unit-context/tokens/txt
2224+/* tre-604 %txt /tests/golden/types-unit-context/tree/txt
2225+/* typ-604 %txt /tests/golden/types-unit-context/types/txt
2226+/* src-605 %jibb /tests/golden/types-unit-patterns/source/jibb
2227+/* tok-605 %txt /tests/golden/types-unit-patterns/tokens/txt
2228+/* tre-605 %txt /tests/golden/types-unit-patterns/tree/txt
2229+/* typ-605 %txt /tests/golden/types-unit-patterns/types/txt
2230+/* src-606 %jibb /tests/golden/types-value-cycle-shadow/source/jibb
2231+/* tok-606 %txt /tests/golden/types-value-cycle-shadow/tokens/txt
2232+/* tre-606 %txt /tests/golden/types-value-cycle-shadow/tree/txt
2233+/* typ-606 %txt /tests/golden/types-value-cycle-shadow/types/txt
2234+/* src-607 %jibb /tests/golden/types-value-cycle-unsupported/source/jibb
2235+/* tok-607 %txt /tests/golden/types-value-cycle-unsupported/tokens/txt
2236+/* tre-607 %txt /tests/golden/types-value-cycle-unsupported/tree/txt
2237+/* typ-607 %txt /tests/golden/types-value-cycle-unsupported/types/txt
2238+/* src-608 %jibb /tests/golden/types-value-cycles/source/jibb
2239+/* tok-608 %txt /tests/golden/types-value-cycles/tokens/txt
2240+/* tre-608 %txt /tests/golden/types-value-cycles/tree/txt
2241+/* typ-608 %txt /tests/golden/types-value-cycles/types/txt
22222242=/ prepared-prelude (prepare-prelude-with-internal:jibb prelude-source internal-source)
22232243|%
22242244:: one arm per case
@@ -3279,158 +3299,166 @@
32793299 (weld (check ~.types-prelude-predicates src-527 `tok-527 `tre-527) (check-module-types ~.types-prelude-predicates ~[%tests %golden ~.types-prelude-predicates %source %jibb] src-527 `typ-527 ~ ~ ~))
32803300++ test-types-prelude-unit-helpers
32813301 (weld (check ~.types-prelude-unit-helpers src-528 `tok-528 `tre-528) (check-module-types ~.types-prelude-unit-helpers ~[%tests %golden ~.types-prelude-unit-helpers %source %jibb] src-528 `typ-528 ~ ~ ~))
3302+++ test-types-qath-faces
3303+ (weld (check ~.types-qath-faces src-529 `tok-529 `tre-529) (check-module-types ~.types-qath-faces ~[%tests %golden ~.types-qath-faces %source %jibb] src-529 `typ-529 ~ ~ ~))
3304+++ test-types-qath-holes
3305+ (weld (check ~.types-qath-holes src-530 `tok-530 `tre-530) (check-module-types ~.types-qath-holes ~[%tests %golden ~.types-qath-holes %source %jibb] src-530 `typ-530 ~ ~ ~))
3306+++ test-types-qath-module-identity
3307+ (weld (weld (check ~.types-qath-module-identity src-531 `tok-531 `tre-531) (check-module-types ~.types-qath-module-identity ~[%tests %golden ~.types-qath-module-identity %source %jibb] src-531 `typ-531 ~ ~ ~[['/ui/one.jibb' ~[~.ui ~.one ~.jibb] mod-531-1] ['/ui/two.jibb' ~[~.ui ~.two ~.jibb] mod-531-2] ['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-531-3]])) (check-module-trees ~.types-qath-module-identity `mtre-531 ~[['/ui/one.jibb' ~[~.ui ~.one ~.jibb] mod-531-1] ['/ui/two.jibb' ~[~.ui ~.two ~.jibb] mod-531-2] ['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-531-3]]))
3308+++ test-types-qath-recursive
3309+ (weld (check ~.types-qath-recursive src-532 `tok-532 `tre-532) (check-module-types ~.types-qath-recursive ~[%tests %golden ~.types-qath-recursive %source %jibb] src-532 `typ-532 ~ ~ ~))
32823310++ test-types-record-bound-variable
3283− (weld (check ~.types-record-bound-variable src-529 `tok-529 `tre-529) (check-types ~.types-record-bound-variable ~[%tests %golden ~.types-record-bound-variable %source %jibb] src-529 `typ-529))
3311+ (weld (check ~.types-record-bound-variable src-533 `tok-533 `tre-533) (check-types ~.types-record-bound-variable ~[%tests %golden ~.types-record-bound-variable %source %jibb] src-533 `typ-533))
32843312++ test-types-record-cast-context
3285− (weld (check ~.types-record-cast-context src-530 `tok-530 `tre-530) (check-module-types ~.types-record-cast-context ~[%tests %golden ~.types-record-cast-context %source %jibb] src-530 `typ-530 ~ ~ ~))
3313+ (weld (check ~.types-record-cast-context src-534 `tok-534 `tre-534) (check-module-types ~.types-record-cast-context ~[%tests %golden ~.types-record-cast-context %source %jibb] src-534 `typ-534 ~ ~ ~))
32863314++ test-types-record-change
3287− (weld (check ~.types-record-change src-531 `tok-531 `tre-531) (check-module-types ~.types-record-change ~[%tests %golden ~.types-record-change %source %jibb] src-531 `typ-531 ~ ~ ~))
3315+ (weld (check ~.types-record-change src-535 `tok-535 `tre-535) (check-module-types ~.types-record-change ~[%tests %golden ~.types-record-change %source %jibb] src-535 `typ-535 ~ ~ ~))
32883316++ test-types-record-change-generic
3289− (weld (check ~.types-record-change-generic src-532 `tok-532 `tre-532) (check-module-types ~.types-record-change-generic ~[%tests %golden ~.types-record-change-generic %source %jibb] src-532 `typ-532 ~ ~ ~))
3317+ (weld (check ~.types-record-change-generic src-536 `tok-536 `tre-536) (check-module-types ~.types-record-change-generic ~[%tests %golden ~.types-record-change-generic %source %jibb] src-536 `typ-536 ~ ~ ~))
32903318++ test-types-record-faces
3291− (weld (check ~.types-record-faces src-533 `tok-533 `tre-533) (check-types ~.types-record-faces ~[%tests %golden ~.types-record-faces %source %jibb] src-533 `typ-533))
3319+ (weld (check ~.types-record-faces src-537 `tok-537 `tre-537) (check-types ~.types-record-faces ~[%tests %golden ~.types-record-faces %source %jibb] src-537 `typ-537))
32923320++ test-types-record-field-edit-separate
3293− (weld (check ~.types-record-field-edit-separate src-534 `tok-534 `tre-534) (check-types ~.types-record-field-edit-separate ~[%tests %golden ~.types-record-field-edit-separate %source %jibb] src-534 `typ-534))
3321+ (weld (check ~.types-record-field-edit-separate src-538 `tok-538 `tre-538) (check-types ~.types-record-field-edit-separate ~[%tests %golden ~.types-record-field-edit-separate %source %jibb] src-538 `typ-538))
32943322++ test-types-record-field-expr-duplicate
3295− (weld (check ~.types-record-field-expr-duplicate src-535 `tok-535 `tre-535) (check-types ~.types-record-field-expr-duplicate ~[%tests %golden ~.types-record-field-expr-duplicate %source %jibb] src-535 `typ-535))
3323+ (weld (check ~.types-record-field-expr-duplicate src-539 `tok-539 `tre-539) (check-types ~.types-record-field-expr-duplicate ~[%tests %golden ~.types-record-field-expr-duplicate %source %jibb] src-539 `typ-539))
32963324++ test-types-record-field-expr-separate
3297− (weld (check ~.types-record-field-expr-separate src-536 `tok-536 `tre-536) (check-types ~.types-record-field-expr-separate ~[%tests %golden ~.types-record-field-expr-separate %source %jibb] src-536 `typ-536))
3325+ (weld (check ~.types-record-field-expr-separate src-540 `tok-540 `tre-540) (check-types ~.types-record-field-expr-separate ~[%tests %golden ~.types-record-field-expr-separate %source %jibb] src-540 `typ-540))
32983326++ test-types-record-field-module-reachable
3299− (weld (weld (check ~.types-record-field-module-reachable src-537 `tok-537 `tre-537) (check-module-types ~.types-record-field-module-reachable ~[%tests %golden ~.types-record-field-module-reachable %source %jibb] src-537 `typ-537 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-537-1]])) (check-module-trees ~.types-record-field-module-reachable `mtre-537 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-537-1]]))
3327+ (weld (weld (check ~.types-record-field-module-reachable src-541 `tok-541 `tre-541) (check-module-types ~.types-record-field-module-reachable ~[%tests %golden ~.types-record-field-module-reachable %source %jibb] src-541 `typ-541 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-541-1]])) (check-module-trees ~.types-record-field-module-reachable `mtre-541 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-541-1]]))
33003328++ test-types-record-field-module-unused
3301− (weld (weld (check ~.types-record-field-module-unused src-538 `tok-538 `tre-538) (check-module-types ~.types-record-field-module-unused ~[%tests %golden ~.types-record-field-module-unused %source %jibb] src-538 `typ-538 ~ ~ ~[['/ui/good.jibb' ~[~.ui ~.good ~.jibb] mod-538-1] ['/ui/unused.jibb' ~[~.ui ~.unused ~.jibb] mod-538-2]])) (check-module-trees ~.types-record-field-module-unused `mtre-538 ~[['/ui/good.jibb' ~[~.ui ~.good ~.jibb] mod-538-1] ['/ui/unused.jibb' ~[~.ui ~.unused ~.jibb] mod-538-2]]))
3329+ (weld (weld (check ~.types-record-field-module-unused src-542 `tok-542 `tre-542) (check-module-types ~.types-record-field-module-unused ~[%tests %golden ~.types-record-field-module-unused %source %jibb] src-542 `typ-542 ~ ~ ~[['/ui/good.jibb' ~[~.ui ~.good ~.jibb] mod-542-1] ['/ui/unused.jibb' ~[~.ui ~.unused ~.jibb] mod-542-2]])) (check-module-trees ~.types-record-field-module-unused `mtre-542 ~[['/ui/good.jibb' ~[~.ui ~.good ~.jibb] mod-542-1] ['/ui/unused.jibb' ~[~.ui ~.unused ~.jibb] mod-542-2]]))
33023330++ test-types-record-field-nested-mold
3303− (weld (check ~.types-record-field-nested-mold src-539 `tok-539 `tre-539) (check-types ~.types-record-field-nested-mold ~[%tests %golden ~.types-record-field-nested-mold %source %jibb] src-539 `typ-539))
3331+ (weld (check ~.types-record-field-nested-mold src-543 `tok-543 `tre-543) (check-types ~.types-record-field-nested-mold ~[%tests %golden ~.types-record-field-nested-mold %source %jibb] src-543 `typ-543))
33043332++ test-types-record-field-outer-inner
3305− (weld (check ~.types-record-field-outer-inner src-540 `tok-540 `tre-540) (check-types ~.types-record-field-outer-inner ~[%tests %golden ~.types-record-field-outer-inner %source %jibb] src-540 `typ-540))
3333+ (weld (check ~.types-record-field-outer-inner src-544 `tok-544 `tre-544) (check-types ~.types-record-field-outer-inner ~[%tests %golden ~.types-record-field-outer-inner %source %jibb] src-544 `typ-544))
33063334++ test-types-record-field-sample-duplicate
3307− (weld (check ~.types-record-field-sample-duplicate src-541 `tok-541 `tre-541) (check-types ~.types-record-field-sample-duplicate ~[%tests %golden ~.types-record-field-sample-duplicate %source %jibb] src-541 `typ-541))
3335+ (weld (check ~.types-record-field-sample-duplicate src-545 `tok-545 `tre-545) (check-types ~.types-record-field-sample-duplicate ~[%tests %golden ~.types-record-field-sample-duplicate %source %jibb] src-545 `typ-545))
33083336++ test-types-record-field-separate-molds
3309− (weld (check ~.types-record-field-separate-molds src-542 `tok-542 `tre-542) (check-types ~.types-record-field-separate-molds ~[%tests %golden ~.types-record-field-separate-molds %source %jibb] src-542 `typ-542))
3337+ (weld (check ~.types-record-field-separate-molds src-546 `tok-546 `tre-546) (check-types ~.types-record-field-separate-molds ~[%tests %golden ~.types-record-field-separate-molds %source %jibb] src-546 `typ-546))
33103338++ test-types-record-field-unused-mold
3311− (weld (check ~.types-record-field-unused-mold src-543 `tok-543 `tre-543) (check-types ~.types-record-field-unused-mold ~[%tests %golden ~.types-record-field-unused-mold %source %jibb] src-543 `typ-543))
3339+ (weld (check ~.types-record-field-unused-mold src-547 `tok-547 `tre-547) (check-types ~.types-record-field-unused-mold ~[%tests %golden ~.types-record-field-unused-mold %source %jibb] src-547 `typ-547))
33123340++ test-types-record-import
3313− (weld (weld (check ~.types-record-import src-544 `tok-544 `tre-544) (check-module-types ~.types-record-import ~[%tests %golden ~.types-record-import %source %jibb] src-544 `typ-544 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-544-1]])) (check-module-trees ~.types-record-import `mtre-544 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-544-1]]))
3341+ (weld (weld (check ~.types-record-import src-548 `tok-548 `tre-548) (check-module-types ~.types-record-import ~[%tests %golden ~.types-record-import %source %jibb] src-548 `typ-548 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-548-1]])) (check-module-trees ~.types-record-import `mtre-548 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-548-1]]))
33143342++ test-types-record-local-scheme
3315− (weld (check ~.types-record-local-scheme src-545 `tok-545 `tre-545) (check-types ~.types-record-local-scheme ~[%tests %golden ~.types-record-local-scheme %source %jibb] src-545 `typ-545))
3343+ (weld (check ~.types-record-local-scheme src-549 `tok-549 `tre-549) (check-types ~.types-record-local-scheme ~[%tests %golden ~.types-record-local-scheme %source %jibb] src-549 `typ-549))
33163344++ test-types-record-nested
3317− (weld (check ~.types-record-nested src-546 `tok-546 `tre-546) (check-types ~.types-record-nested ~[%tests %golden ~.types-record-nested %source %jibb] src-546 `typ-546))
3345+ (weld (check ~.types-record-nested src-550 `tok-550 `tre-550) (check-types ~.types-record-nested ~[%tests %golden ~.types-record-nested %source %jibb] src-550 `typ-550))
33183346++ test-types-record-to-tuple
3319− (weld (check ~.types-record-to-tuple src-547 `tok-547 `tre-547) (check-types ~.types-record-to-tuple ~[%tests %golden ~.types-record-to-tuple %source %jibb] src-547 `typ-547))
3347+ (weld (check ~.types-record-to-tuple src-551 `tok-551 `tre-551) (check-types ~.types-record-to-tuple ~[%tests %golden ~.types-record-to-tuple %source %jibb] src-551 `typ-551))
33203348++ test-types-recursion-scc-failures
3321− (weld (check ~.types-recursion-scc-failures src-548 `tok-548 `tre-548) (check-module-types ~.types-recursion-scc-failures ~[%tests %golden ~.types-recursion-scc-failures %source %jibb] src-548 `typ-548 ~ ~ ~))
3349+ (weld (check ~.types-recursion-scc-failures src-552 `tok-552 `tre-552) (check-module-types ~.types-recursion-scc-failures ~[%tests %golden ~.types-recursion-scc-failures %source %jibb] src-552 `typ-552 ~ ~ ~))
33223350++ test-types-recursion-scc-groups
3323− (weld (check ~.types-recursion-scc-groups src-549 `tok-549 `tre-549) (check-module-types ~.types-recursion-scc-groups ~[%tests %golden ~.types-recursion-scc-groups %source %jibb] src-549 `typ-549 ~ ~ ~))
3351+ (weld (check ~.types-recursion-scc-groups src-553 `tok-553 `tre-553) (check-module-types ~.types-recursion-scc-groups ~[%tests %golden ~.types-recursion-scc-groups %source %jibb] src-553 `typ-553 ~ ~ ~))
33243352++ test-types-recursion-scc-import
3325− (weld (weld (check ~.types-recursion-scc-import src-550 `tok-550 `tre-550) (check-module-types ~.types-recursion-scc-import ~[%tests %golden ~.types-recursion-scc-import %source %jibb] src-550 `typ-550 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-550-1]])) (check-module-trees ~.types-recursion-scc-import `mtre-550 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-550-1]]))
3353+ (weld (weld (check ~.types-recursion-scc-import src-554 `tok-554 `tre-554) (check-module-types ~.types-recursion-scc-import ~[%tests %golden ~.types-recursion-scc-import %source %jibb] src-554 `typ-554 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-554-1]])) (check-module-trees ~.types-recursion-scc-import `mtre-554 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-554-1]]))
33263354++ test-types-recursion-scc-import-bad
3327− (weld (weld (check ~.types-recursion-scc-import-bad src-551 `tok-551 `tre-551) (check-module-types ~.types-recursion-scc-import-bad ~[%tests %golden ~.types-recursion-scc-import-bad %source %jibb] src-551 `typ-551 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-551-1]])) (check-module-trees ~.types-recursion-scc-import-bad `mtre-551 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-551-1]]))
3355+ (weld (weld (check ~.types-recursion-scc-import-bad src-555 `tok-555 `tre-555) (check-module-types ~.types-recursion-scc-import-bad ~[%tests %golden ~.types-recursion-scc-import-bad %source %jibb] src-555 `typ-555 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-555-1]])) (check-module-trees ~.types-recursion-scc-import-bad `mtre-555 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-555-1]]))
33283356++ test-types-recursion-scc-local
3329− (weld (check ~.types-recursion-scc-local src-552 `tok-552 `tre-552) (check-module-types ~.types-recursion-scc-local ~[%tests %golden ~.types-recursion-scc-local %source %jibb] src-552 `typ-552 ~ ~ ~))
3357+ (weld (check ~.types-recursion-scc-local src-556 `tok-556 `tre-556) (check-module-types ~.types-recursion-scc-local ~[%tests %golden ~.types-recursion-scc-local %source %jibb] src-556 `typ-556 ~ ~ ~))
33303358++ test-types-recursion-scc-order
3331− (weld (check ~.types-recursion-scc-order src-553 `tok-553 `tre-553) (check-module-types ~.types-recursion-scc-order ~[%tests %golden ~.types-recursion-scc-order %source %jibb] src-553 `typ-553 ~ ~ ~))
3359+ (weld (check ~.types-recursion-scc-order src-557 `tok-557 `tre-557) (check-module-types ~.types-recursion-scc-order ~[%tests %golden ~.types-recursion-scc-order %source %jibb] src-557 `typ-557 ~ ~ ~))
33323360++ test-types-recursion-scc-shadow
3333− (weld (check ~.types-recursion-scc-shadow src-554 `tok-554 `tre-554) (check-module-types ~.types-recursion-scc-shadow ~[%tests %golden ~.types-recursion-scc-shadow %source %jibb] src-554 `typ-554 ~ ~ ~))
3361+ (weld (check ~.types-recursion-scc-shadow src-558 `tok-558 `tre-558) (check-module-types ~.types-recursion-scc-shadow ~[%tests %golden ~.types-recursion-scc-shadow %source %jibb] src-558 `typ-558 ~ ~ ~))
33343362++ test-types-recursive-branch
3335− (weld (check ~.types-recursive-branch src-555 `tok-555 `tre-555) (check-module-types ~.types-recursive-branch ~[%tests %golden ~.types-recursive-branch %source %jibb] src-555 `typ-555 ~ ~ ~))
3363+ (weld (check ~.types-recursive-branch src-559 `tok-559 `tre-559) (check-module-types ~.types-recursive-branch ~[%tests %golden ~.types-recursive-branch %source %jibb] src-559 `typ-559 ~ ~ ~))
33363364++ test-types-recursive-gate
3337− (weld (check ~.types-recursive-gate src-556 `tok-556 `tre-556) (check-types ~.types-recursive-gate ~[%tests %golden ~.types-recursive-gate %source %jibb] src-556 `typ-556))
3365+ (weld (check ~.types-recursive-gate src-560 `tok-560 `tre-560) (check-types ~.types-recursive-gate ~[%tests %golden ~.types-recursive-gate %source %jibb] src-560 `typ-560))
33383366++ test-types-recursive-sample
3339− (weld (check ~.types-recursive-sample src-557 `tok-557 `tre-557) (check-types ~.types-recursive-sample ~[%tests %golden ~.types-recursive-sample %source %jibb] src-557 `typ-557))
3367+ (weld (check ~.types-recursive-sample src-561 `tok-561 `tre-561) (check-types ~.types-recursive-sample ~[%tests %golden ~.types-recursive-sample %source %jibb] src-561 `typ-561))
33403368++ test-types-scope-library-poke
3341− (weld (check-at ~.types-scope-library-poke ~[~.ui ~.lib ~.library ~.jibb] src-558 `tok-558 `tre-558) (check-module-types ~.types-scope-library-poke ~[~.ui ~.lib ~.library ~.jibb] src-558 `typ-558 ~ ~ ~))
3369+ (weld (check-at ~.types-scope-library-poke ~[~.ui ~.lib ~.library ~.jibb] src-562 `tok-562 `tre-562) (check-module-types ~.types-scope-library-poke ~[~.ui ~.lib ~.library ~.jibb] src-562 `typ-562 ~ ~ ~))
33423370++ test-types-scope-root-api
3343− (weld (check-at ~.types-scope-root-api ~[~.ui ~.api ~.todo ~.jibb] src-559 `tok-559 `tre-559) (check-module-types ~.types-scope-root-api ~[~.ui ~.api ~.todo ~.jibb] src-559 `typ-559 ~ ~ ~))
3371+ (weld (check-at ~.types-scope-root-api ~[~.ui ~.api ~.todo ~.jibb] src-563 `tok-563 `tre-563) (check-module-types ~.types-scope-root-api ~[~.ui ~.api ~.todo ~.jibb] src-563 `typ-563 ~ ~ ~))
33443372++ test-types-scope-store-duplicate
3345− (weld (check-at ~.types-scope-store-duplicate ~[~.ui ~.stores ~.cart ~.jibb] src-560 `tok-560 `tre-560) (check-module-types ~.types-scope-store-duplicate ~[~.ui ~.stores ~.cart ~.jibb] src-560 `typ-560 ~ ~ ~))
3373+ (weld (check-at ~.types-scope-store-duplicate ~[~.ui ~.stores ~.cart ~.jibb] src-564 `tok-564 `tre-564) (check-module-types ~.types-scope-store-duplicate ~[~.ui ~.stores ~.cart ~.jibb] src-564 `typ-564 ~ ~ ~))
33463374++ test-types-scope-store-shadow
3347− (weld (check-at ~.types-scope-store-shadow ~[~.ui ~.stores ~.cart ~.jibb] src-561 `tok-561 `tre-561) (check-module-types ~.types-scope-store-shadow ~[~.ui ~.stores ~.cart ~.jibb] src-561 `typ-561 ~ ~ ~))
3375+ (weld (check-at ~.types-scope-store-shadow ~[~.ui ~.stores ~.cart ~.jibb] src-565 `tok-565 `tre-565) (check-module-types ~.types-scope-store-shadow ~[~.ui ~.stores ~.cart ~.jibb] src-565 `typ-565 ~ ~ ~))
33483376++ test-types-single-case-pattern
3349− (weld (check ~.types-single-case-pattern src-562 `tok-562 `tre-562) (check-module-types ~.types-single-case-pattern ~[%tests %golden ~.types-single-case-pattern %source %jibb] src-562 `typ-562 ~ ~ ~))
3377+ (weld (check ~.types-single-case-pattern src-566 `tok-566 `tre-566) (check-module-types ~.types-single-case-pattern ~[%tests %golden ~.types-single-case-pattern %source %jibb] src-566 `typ-566 ~ ~ ~))
33503378++ test-types-string-interpolation
3351− (weld (check ~.types-string-interpolation src-563 `tok-563 `tre-563) (check-module-types ~.types-string-interpolation ~[%tests %golden ~.types-string-interpolation %source %jibb] src-563 `typ-563 ~ ~ ~))
3379+ (weld (check ~.types-string-interpolation src-567 `tok-567 `tre-567) (check-module-types ~.types-string-interpolation ~[%tests %golden ~.types-string-interpolation %source %jibb] src-567 `typ-567 ~ ~ ~))
33523380++ test-types-tuple-context
3353− (weld (check ~.types-tuple-context src-564 `tok-564 `tre-564) (check-module-types ~.types-tuple-context ~[%tests %golden ~.types-tuple-context %source %jibb] src-564 `typ-564 ~ ~ ~))
3381+ (weld (check ~.types-tuple-context src-568 `tok-568 `tre-568) (check-module-types ~.types-tuple-context ~[%tests %golden ~.types-tuple-context %source %jibb] src-568 `typ-568 ~ ~ ~))
33543382++ test-types-tuple-context-nested
3355− (weld (check ~.types-tuple-context-nested src-565 `tok-565 `tre-565) (check-module-types ~.types-tuple-context-nested ~[%tests %golden ~.types-tuple-context-nested %source %jibb] src-565 `typ-565 ~ ~ ~))
3383+ (weld (check ~.types-tuple-context-nested src-569 `tok-569 `tre-569) (check-module-types ~.types-tuple-context-nested ~[%tests %golden ~.types-tuple-context-nested %source %jibb] src-569 `typ-569 ~ ~ ~))
33563384++ test-types-union-alias
3357− (weld (check ~.types-union-alias src-566 `tok-566 `tre-566) (check-types ~.types-union-alias ~[%tests %golden ~.types-union-alias %source %jibb] src-566 `typ-566))
3385+ (weld (check ~.types-union-alias src-570 `tok-570 `tre-570) (check-types ~.types-union-alias ~[%tests %golden ~.types-union-alias %source %jibb] src-570 `typ-570))
33583386++ test-types-union-branch-context
3359− (weld (check ~.types-union-branch-context src-567 `tok-567 `tre-567) (check-types ~.types-union-branch-context ~[%tests %golden ~.types-union-branch-context %source %jibb] src-567 `typ-567))
3387+ (weld (check ~.types-union-branch-context src-571 `tok-571 `tre-571) (check-types ~.types-union-branch-context ~[%tests %golden ~.types-union-branch-context %source %jibb] src-571 `typ-571))
33603388++ test-types-union-branch-pending
3361− (weld (check ~.types-union-branch-pending src-568 `tok-568 `tre-568) (check-types ~.types-union-branch-pending ~[%tests %golden ~.types-union-branch-pending %source %jibb] src-568 `typ-568))
3389+ (weld (check ~.types-union-branch-pending src-572 `tok-572 `tre-572) (check-types ~.types-union-branch-pending ~[%tests %golden ~.types-union-branch-pending %source %jibb] src-572 `typ-572))
33623390++ test-types-union-constructor-shape
3363− (weld (check ~.types-union-constructor-shape src-569 `tok-569 `tre-569) (check-types ~.types-union-constructor-shape ~[%tests %golden ~.types-union-constructor-shape %source %jibb] src-569 `typ-569))
3391+ (weld (check ~.types-union-constructor-shape src-573 `tok-573 `tre-573) (check-types ~.types-union-constructor-shape ~[%tests %golden ~.types-union-constructor-shape %source %jibb] src-573 `typ-573))
33643392++ test-types-union-context-flow
3365− (weld (check ~.types-union-context-flow src-570 `tok-570 `tre-570) (check-types ~.types-union-context-flow ~[%tests %golden ~.types-union-context-flow %source %jibb] src-570 `typ-570))
3393+ (weld (check ~.types-union-context-flow src-574 `tok-574 `tre-574) (check-types ~.types-union-context-flow ~[%tests %golden ~.types-union-context-flow %source %jibb] src-574 `typ-574))
33663394++ test-types-union-finite
3367− (weld (check ~.types-union-finite src-571 `tok-571 `tre-571) (check-module-types ~.types-union-finite ~[%tests %golden ~.types-union-finite %source %jibb] src-571 `typ-571 ~ ~ ~))
3395+ (weld (check ~.types-union-finite src-575 `tok-575 `tre-575) (check-module-types ~.types-union-finite ~[%tests %golden ~.types-union-finite %source %jibb] src-575 `typ-575 ~ ~ ~))
33683396++ test-types-union-finite-context
3369− (weld (check ~.types-union-finite-context src-572 `tok-572 `tre-572) (check-module-types ~.types-union-finite-context ~[%tests %golden ~.types-union-finite-context %source %jibb] src-572 `typ-572 ~ ~ ~))
3397+ (weld (check ~.types-union-finite-context src-576 `tok-576 `tre-576) (check-module-types ~.types-union-finite-context ~[%tests %golden ~.types-union-finite-context %source %jibb] src-576 `typ-576 ~ ~ ~))
33703398++ test-types-union-finite-generic
3371− (weld (check ~.types-union-finite-generic src-573 `tok-573 `tre-573) (check-module-types ~.types-union-finite-generic ~[%tests %golden ~.types-union-finite-generic %source %jibb] src-573 `typ-573 ~ ~ ~))
3399+ (weld (check ~.types-union-finite-generic src-577 `tok-577 `tre-577) (check-module-types ~.types-union-finite-generic ~[%tests %golden ~.types-union-finite-generic %source %jibb] src-577 `typ-577 ~ ~ ~))
33723400++ test-types-union-finite-limit
3373− (weld (check ~.types-union-finite-limit src-574 `tok-574 `tre-574) (check-module-types ~.types-union-finite-limit ~[%tests %golden ~.types-union-finite-limit %source %jibb] src-574 `typ-574 ~ ~ ~))
3401+ (weld (check ~.types-union-finite-limit src-578 `tok-578 `tre-578) (check-module-types ~.types-union-finite-limit ~[%tests %golden ~.types-union-finite-limit %source %jibb] src-578 `typ-578 ~ ~ ~))
33743402++ test-types-union-import
3375− (weld (weld (check ~.types-union-import src-575 `tok-575 `tre-575) (check-module-types ~.types-union-import ~[%tests %golden ~.types-union-import %source %jibb] src-575 `typ-575 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-575-1]])) (check-module-trees ~.types-union-import `mtre-575 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-575-1]]))
3403+ (weld (weld (check ~.types-union-import src-579 `tok-579 `tre-579) (check-module-types ~.types-union-import ~[%tests %golden ~.types-union-import %source %jibb] src-579 `typ-579 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-579-1]])) (check-module-trees ~.types-union-import `mtre-579 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-579-1]]))
33763404++ test-types-union-local-pending
3377− (weld (check ~.types-union-local-pending src-576 `tok-576 `tre-576) (check-types ~.types-union-local-pending ~[%tests %golden ~.types-union-local-pending %source %jibb] src-576 `typ-576))
3405+ (weld (check ~.types-union-local-pending src-580 `tok-580 `tre-580) (check-types ~.types-union-local-pending ~[%tests %golden ~.types-union-local-pending %source %jibb] src-580 `typ-580))
33783406++ test-types-union-nonwing-subject
3379− (weld (check ~.types-union-nonwing-subject src-577 `tok-577 `tre-577) (check-module-types ~.types-union-nonwing-subject ~[%tests %golden ~.types-union-nonwing-subject %source %jibb] src-577 `typ-577 ~ ~ ~))
3407+ (weld (check ~.types-union-nonwing-subject src-581 `tok-581 `tre-581) (check-module-types ~.types-union-nonwing-subject ~[%tests %golden ~.types-union-nonwing-subject %source %jibb] src-581 `typ-581 ~ ~ ~))
33803408++ test-types-union-overlap
3381− (weld (check ~.types-union-overlap src-578 `tok-578 `tre-578) (check-types ~.types-union-overlap ~[%tests %golden ~.types-union-overlap %source %jibb] src-578 `typ-578))
3409+ (weld (check ~.types-union-overlap src-582 `tok-582 `tre-582) (check-types ~.types-union-overlap ~[%tests %golden ~.types-union-overlap %source %jibb] src-582 `typ-582))
33823410++ test-types-union-overlap-nested
3383− (weld (check ~.types-union-overlap-nested src-579 `tok-579 `tre-579) (check-types ~.types-union-overlap-nested ~[%tests %golden ~.types-union-overlap-nested %source %jibb] src-579 `typ-579))
3411+ (weld (check ~.types-union-overlap-nested src-583 `tok-583 `tre-583) (check-types ~.types-union-overlap-nested ~[%tests %golden ~.types-union-overlap-nested %source %jibb] src-583 `typ-583))
33843412++ test-types-union-pattern-result-context
3385− (weld (check ~.types-union-pattern-result-context src-580 `tok-580 `tre-580) (check-module-types ~.types-union-pattern-result-context ~[%tests %golden ~.types-union-pattern-result-context %source %jibb] src-580 `typ-580 ~ ~ ~))
3413+ (weld (check ~.types-union-pattern-result-context src-584 `tok-584 `tre-584) (check-module-types ~.types-union-pattern-result-context ~[%tests %golden ~.types-union-pattern-result-context %source %jibb] src-584 `typ-584 ~ ~ ~))
33863414++ test-types-union-pattern-result-controls
3387− (weld (check ~.types-union-pattern-result-controls src-581 `tok-581 `tre-581) (check-module-types ~.types-union-pattern-result-controls ~[%tests %golden ~.types-union-pattern-result-controls %source %jibb] src-581 `typ-581 ~ ~ ~))
3415+ (weld (check ~.types-union-pattern-result-controls src-585 `tok-585 `tre-585) (check-module-types ~.types-union-pattern-result-controls ~[%tests %golden ~.types-union-pattern-result-controls %source %jibb] src-585 `typ-585 ~ ~ ~))
33883416++ test-types-union-patterns
3389− (weld (check ~.types-union-patterns src-582 `tok-582 `tre-582) (check-module-types ~.types-union-patterns ~[%tests %golden ~.types-union-patterns %source %jibb] src-582 `typ-582 ~ ~ ~))
3417+ (weld (check ~.types-union-patterns src-586 `tok-586 `tre-586) (check-module-types ~.types-union-patterns ~[%tests %golden ~.types-union-patterns %source %jibb] src-586 `typ-586 ~ ~ ~))
33903418++ test-types-union-patterns-generic
3391− (weld (check ~.types-union-patterns-generic src-583 `tok-583 `tre-583) (check-module-types ~.types-union-patterns-generic ~[%tests %golden ~.types-union-patterns-generic %source %jibb] src-583 `typ-583 ~ ~ ~))
3419+ (weld (check ~.types-union-patterns-generic src-587 `tok-587 `tre-587) (check-module-types ~.types-union-patterns-generic ~[%tests %golden ~.types-union-patterns-generic %source %jibb] src-587 `typ-587 ~ ~ ~))
33923420++ test-types-union-patterns-import
3393− (weld (weld (check ~.types-union-patterns-import src-584 `tok-584 `tre-584) (check-module-types ~.types-union-patterns-import ~[%tests %golden ~.types-union-patterns-import %source %jibb] src-584 `typ-584 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-584-1]])) (check-module-trees ~.types-union-patterns-import `mtre-584 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-584-1]]))
3421+ (weld (weld (check ~.types-union-patterns-import src-588 `tok-588 `tre-588) (check-module-types ~.types-union-patterns-import ~[%tests %golden ~.types-union-patterns-import %source %jibb] src-588 `typ-588 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-588-1]])) (check-module-trees ~.types-union-patterns-import `mtre-588 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-588-1]]))
33943422++ test-types-union-phantom-generic
3395− (weld (check ~.types-union-phantom-generic src-585 `tok-585 `tre-585) (check-types ~.types-union-phantom-generic ~[%tests %golden ~.types-union-phantom-generic %source %jibb] src-585 `typ-585))
3423+ (weld (check ~.types-union-phantom-generic src-589 `tok-589 `tre-589) (check-types ~.types-union-phantom-generic ~[%tests %golden ~.types-union-phantom-generic %source %jibb] src-589 `typ-589))
33963424++ test-types-union-polymorphic-identity
3397− (weld (weld (check ~.types-union-polymorphic-identity src-586 `tok-586 `tre-586) (check-module-types ~.types-union-polymorphic-identity ~[%tests %golden ~.types-union-polymorphic-identity %source %jibb] src-586 `typ-586 ~ ~ ~[['/ui/one.jibb' ~[~.ui ~.one ~.jibb] mod-586-1] ['/ui/two.jibb' ~[~.ui ~.two ~.jibb] mod-586-2]])) (check-module-trees ~.types-union-polymorphic-identity `mtre-586 ~[['/ui/one.jibb' ~[~.ui ~.one ~.jibb] mod-586-1] ['/ui/two.jibb' ~[~.ui ~.two ~.jibb] mod-586-2]]))
3425+ (weld (weld (check ~.types-union-polymorphic-identity src-590 `tok-590 `tre-590) (check-module-types ~.types-union-polymorphic-identity ~[%tests %golden ~.types-union-polymorphic-identity %source %jibb] src-590 `typ-590 ~ ~ ~[['/ui/one.jibb' ~[~.ui ~.one ~.jibb] mod-590-1] ['/ui/two.jibb' ~[~.ui ~.two ~.jibb] mod-590-2]])) (check-module-trees ~.types-union-polymorphic-identity `mtre-590 ~[['/ui/one.jibb' ~[~.ui ~.one ~.jibb] mod-590-1] ['/ui/two.jibb' ~[~.ui ~.two ~.jibb] mod-590-2]]))
33983426++ test-types-union-print-cross-namespace
3399− (weld (weld (check ~.types-union-print-cross-namespace src-587 `tok-587 `tre-587) (check-module-types ~.types-union-print-cross-namespace ~[%tests %golden ~.types-union-print-cross-namespace %source %jibb] src-587 `typ-587 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-587-1]])) (check-module-trees ~.types-union-print-cross-namespace `mtre-587 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-587-1]]))
3427+ (weld (weld (check ~.types-union-print-cross-namespace src-591 `tok-591 `tre-591) (check-module-types ~.types-union-print-cross-namespace ~[%tests %golden ~.types-union-print-cross-namespace %source %jibb] src-591 `typ-591 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-591-1]])) (check-module-trees ~.types-union-print-cross-namespace `mtre-591 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-591-1]]))
34003428++ test-types-union-print-distinct
3401− (weld (weld (check ~.types-union-print-distinct src-588 `tok-588 `tre-588) (check-module-types ~.types-union-print-distinct ~[%tests %golden ~.types-union-print-distinct %source %jibb] src-588 `typ-588 ~ ~ ~[['/ui/left.jibb' ~[~.ui ~.left ~.jibb] mod-588-1] ['/ui/right.jibb' ~[~.ui ~.right ~.jibb] mod-588-2] ['/ui/twin.jibb' ~[~.ui ~.twin ~.jibb] mod-588-3]])) (check-module-trees ~.types-union-print-distinct `mtre-588 ~[['/ui/left.jibb' ~[~.ui ~.left ~.jibb] mod-588-1] ['/ui/right.jibb' ~[~.ui ~.right ~.jibb] mod-588-2] ['/ui/twin.jibb' ~[~.ui ~.twin ~.jibb] mod-588-3]]))
3429+ (weld (weld (check ~.types-union-print-distinct src-592 `tok-592 `tre-592) (check-module-types ~.types-union-print-distinct ~[%tests %golden ~.types-union-print-distinct %source %jibb] src-592 `typ-592 ~ ~ ~[['/ui/left.jibb' ~[~.ui ~.left ~.jibb] mod-592-1] ['/ui/right.jibb' ~[~.ui ~.right ~.jibb] mod-592-2] ['/ui/twin.jibb' ~[~.ui ~.twin ~.jibb] mod-592-3]])) (check-module-trees ~.types-union-print-distinct `mtre-592 ~[['/ui/left.jibb' ~[~.ui ~.left ~.jibb] mod-592-1] ['/ui/right.jibb' ~[~.ui ~.right ~.jibb] mod-592-2] ['/ui/twin.jibb' ~[~.ui ~.twin ~.jibb] mod-592-3]]))
34023430++ test-types-union-print-escape
3403− (weld (check ~.types-union-print-escape src-589 `tok-589 `tre-589) (check-types ~.types-union-print-escape ~[%tests %golden ~.types-union-print-escape %source %jibb] src-589 `typ-589))
3431+ (weld (check ~.types-union-print-escape src-593 `tok-593 `tre-593) (check-types ~.types-union-print-escape ~[%tests %golden ~.types-union-print-escape %source %jibb] src-593 `typ-593))
34043432++ test-types-union-print-local
3405− (weld (check ~.types-union-print-local src-590 `tok-590 `tre-590) (check-types ~.types-union-print-local ~[%tests %golden ~.types-union-print-local %source %jibb] src-590 `typ-590))
3433+ (weld (check ~.types-union-print-local src-594 `tok-594 `tre-594) (check-types ~.types-union-print-local ~[%tests %golden ~.types-union-print-local %source %jibb] src-594 `typ-594))
34063434++ test-types-union-print-nested
3407− (weld (check ~.types-union-print-nested src-591 `tok-591 `tre-591) (check-types ~.types-union-print-nested ~[%tests %golden ~.types-union-print-nested %source %jibb] src-591 `typ-591))
3435+ (weld (check ~.types-union-print-nested src-595 `tok-595 `tre-595) (check-types ~.types-union-print-nested ~[%tests %golden ~.types-union-print-nested %source %jibb] src-595 `typ-595))
34083436++ test-types-union-print-same-origin
3409− (weld (weld (check ~.types-union-print-same-origin src-592 `tok-592 `tre-592) (check-module-types ~.types-union-print-same-origin ~[%tests %golden ~.types-union-print-same-origin %source %jibb] src-592 `typ-592 ~ ~ ~[['/ui/shared.jibb' ~[~.ui ~.shared ~.jibb] mod-592-1]])) (check-module-trees ~.types-union-print-same-origin `mtre-592 ~[['/ui/shared.jibb' ~[~.ui ~.shared ~.jibb] mod-592-1]]))
3437+ (weld (weld (check ~.types-union-print-same-origin src-596 `tok-596 `tre-596) (check-module-types ~.types-union-print-same-origin ~[%tests %golden ~.types-union-print-same-origin %source %jibb] src-596 `typ-596 ~ ~ ~[['/ui/shared.jibb' ~[~.ui ~.shared ~.jibb] mod-596-1]])) (check-module-trees ~.types-union-print-same-origin `mtre-596 ~[['/ui/shared.jibb' ~[~.ui ~.shared ~.jibb] mod-596-1]]))
34103438++ test-types-union-print-transitive
3411− (weld (weld (check ~.types-union-print-transitive src-593 `tok-593 `tre-593) (check-module-types ~.types-union-print-transitive ~[%tests %golden ~.types-union-print-transitive %source %jibb] src-593 `typ-593 ~ ~ ~[['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-593-1] ['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-593-2]])) (check-module-trees ~.types-union-print-transitive `mtre-593 ~[['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-593-1] ['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-593-2]]))
3439+ (weld (weld (check ~.types-union-print-transitive src-597 `tok-597 `tre-597) (check-module-types ~.types-union-print-transitive ~[%tests %golden ~.types-union-print-transitive %source %jibb] src-597 `typ-597 ~ ~ ~[['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-597-1] ['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-597-2]])) (check-module-trees ~.types-union-print-transitive `mtre-597 ~[['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-597-1] ['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-597-2]]))
34123440++ test-types-union-singleton
3413− (weld (check ~.types-union-singleton src-594 `tok-594 `tre-594) (check-types ~.types-union-singleton ~[%tests %golden ~.types-union-singleton %source %jibb] src-594 `typ-594))
3441+ (weld (check ~.types-union-singleton src-598 `tok-598 `tre-598) (check-types ~.types-union-singleton ~[%tests %golden ~.types-union-singleton %source %jibb] src-598 `typ-598))
34143442++ test-types-union-tag-atoms
3415− (weld (check ~.types-union-tag-atoms src-595 `tok-595 `tre-595) (check-types ~.types-union-tag-atoms ~[%tests %golden ~.types-union-tag-atoms %source %jibb] src-595 `typ-595))
3443+ (weld (check ~.types-union-tag-atoms src-599 `tok-599 `tre-599) (check-types ~.types-union-tag-atoms ~[%tests %golden ~.types-union-tag-atoms %source %jibb] src-599 `typ-599))
34163444++ test-types-union-tags
3417− (weld (check ~.types-union-tags src-596 `tok-596 `tre-596) (check-types ~.types-union-tags ~[%tests %golden ~.types-union-tags %source %jibb] src-596 `typ-596))
3445+ (weld (check ~.types-union-tags src-600 `tok-600 `tre-600) (check-types ~.types-union-tags ~[%tests %golden ~.types-union-tags %source %jibb] src-600 `typ-600))
34183446++ test-types-union-unresolved
3419− (weld (check ~.types-union-unresolved src-597 `tok-597 `tre-597) (check-types ~.types-union-unresolved ~[%tests %golden ~.types-union-unresolved %source %jibb] src-597 `typ-597))
3447+ (weld (check ~.types-union-unresolved src-601 `tok-601 `tre-601) (check-types ~.types-union-unresolved ~[%tests %golden ~.types-union-unresolved %source %jibb] src-601 `typ-601))
34203448++ test-types-union-unresolved-flow
3421− (weld (check ~.types-union-unresolved-flow src-598 `tok-598 `tre-598) (check-types ~.types-union-unresolved-flow ~[%tests %golden ~.types-union-unresolved-flow %source %jibb] src-598 `typ-598))
3449+ (weld (check ~.types-union-unresolved-flow src-602 `tok-602 `tre-602) (check-types ~.types-union-unresolved-flow ~[%tests %golden ~.types-union-unresolved-flow %source %jibb] src-602 `typ-602))
34223450++ test-types-unit-construction
3423− (weld (check ~.types-unit-construction src-599 `tok-599 `tre-599) (check-module-types ~.types-unit-construction ~[%tests %golden ~.types-unit-construction %source %jibb] src-599 `typ-599 ~ ~ ~))
3451+ (weld (check ~.types-unit-construction src-603 `tok-603 `tre-603) (check-module-types ~.types-unit-construction ~[%tests %golden ~.types-unit-construction %source %jibb] src-603 `typ-603 ~ ~ ~))
34243452++ test-types-unit-context
3425− (weld (check ~.types-unit-context src-600 `tok-600 `tre-600) (check-module-types ~.types-unit-context ~[%tests %golden ~.types-unit-context %source %jibb] src-600 `typ-600 ~ ~ ~))
3453+ (weld (check ~.types-unit-context src-604 `tok-604 `tre-604) (check-module-types ~.types-unit-context ~[%tests %golden ~.types-unit-context %source %jibb] src-604 `typ-604 ~ ~ ~))
34263454++ test-types-unit-patterns
3427− (weld (check ~.types-unit-patterns src-601 `tok-601 `tre-601) (check-types ~.types-unit-patterns ~[%tests %golden ~.types-unit-patterns %source %jibb] src-601 `typ-601))
3455+ (weld (check ~.types-unit-patterns src-605 `tok-605 `tre-605) (check-types ~.types-unit-patterns ~[%tests %golden ~.types-unit-patterns %source %jibb] src-605 `typ-605))
34283456++ test-types-value-cycle-shadow
3429− (weld (check ~.types-value-cycle-shadow src-602 `tok-602 `tre-602) (check-module-types ~.types-value-cycle-shadow ~[%tests %golden ~.types-value-cycle-shadow %source %jibb] src-602 `typ-602 ~ ~ ~))
3457+ (weld (check ~.types-value-cycle-shadow src-606 `tok-606 `tre-606) (check-module-types ~.types-value-cycle-shadow ~[%tests %golden ~.types-value-cycle-shadow %source %jibb] src-606 `typ-606 ~ ~ ~))
34303458++ test-types-value-cycle-unsupported
3431− (weld (check ~.types-value-cycle-unsupported src-603 `tok-603 `tre-603) (check-module-types ~.types-value-cycle-unsupported ~[%tests %golden ~.types-value-cycle-unsupported %source %jibb] src-603 `typ-603 ~ ~ ~))
3459+ (weld (check ~.types-value-cycle-unsupported src-607 `tok-607 `tre-607) (check-module-types ~.types-value-cycle-unsupported ~[%tests %golden ~.types-value-cycle-unsupported %source %jibb] src-607 `typ-607 ~ ~ ~))
34323460++ test-types-value-cycles
3433− (weld (check ~.types-value-cycles src-604 `tok-604 `tre-604) (check-module-types ~.types-value-cycles ~[%tests %golden ~.types-value-cycles %source %jibb] src-604 `typ-604 ~ ~ ~))
3461+ (weld (check ~.types-value-cycles src-608 `tok-608 `tre-608) (check-module-types ~.types-value-cycles ~[%tests %golden ~.types-value-cycles %source %jibb] src-608 `typ-608 ~ ~ ~))
34343462::
34353463:: +check: run golden:jibb on a case and compare both outputs
34363464::
tools/type-qath-guards-testnew file+31
@@ -0,0 +1,31 @@
1+#!/usr/bin/env python3
2+"""Run the shared qath fuel, face, and source-provenance guards under eval."""
3+from pathlib import Path
4+import argparse
5+import subprocess
6+import sys
7+import tempfile
8+
9+root = Path(__file__).resolve().parent.parent
10+parser = argparse.ArgumentParser(description=__doc__)
11+parser.add_argument('--lib', default=str(root / 'jibb-dev/lib/jibb.hoon'))
12+args = parser.parse_args()
13+with tempfile.TemporaryDirectory(prefix='jibb-qath-guards-') as tmp:
14+ for kind in ('fuel', 'source'):
15+ tests = (root / f'tests/lib/jibb-qath-{kind}.hoon').read_text()
16+ tests = tests[tests.index('\n|%\n') + 1:]
17+ expression = ('=/ jibb .\n=/ real-internal=@t internal\n=/ suite\n' + tests +
18+ f'\n=/ failures=(list tape) qath-{kind}-errors:suite\n^- @t\n' +
19+ "?~ failures 'qath guards passed'\n" +
20+ '(of-wain:format (turn failures crip))\n')
21+ program = Path(tmp) / f'{kind}.hoon'
22+ program.write_text(expression)
23+ command = [str(root / 'tools/hoon'), '--lib', args.lib, '--raw', '-f', str(program),
24+ '--cord', 'internal=' + str(root / 'jibb-dev/lib/jibb/internal.jibb')]
25+ result = subprocess.run(command, stdout=subprocess.PIPE)
26+ if result.returncode:
27+ sys.exit(result.returncode)
28+ if result.stdout != b'qath guards passed\n':
29+ sys.stderr.buffer.write(result.stdout)
30+ sys.exit(1)
31+print('qath fuel, face, and source guards passed')