on master help sign in
Infer tuple contexts and record changes
commit54852d4c610e83b5a476f7e3bebb39860ff5de9c authoriko <mail@iko.soy> dateSat 31 Oct 2026, 00:15 (10 hours ago) parent9dd35c8
37 files changed+1759−273
docs/compiler.md+3−1 docs/status.md+7−6 jibb-dev/lib/jibb.hoon+66−6 tests/golden/doc-grammar-06-cart-store/about.txt+1 tests/golden/doc-grammar-06-cart-store/modules.txt+1 tests/golden/doc-grammar-06-cart-store/types.txt+7 tests/golden/types-list-zero-fit/about.txt+1−1 tests/golden/types-list-zero-fit/types.txt+3−3 tests/golden/types-prelude-direct/about.txt+1−1 tests/golden/types-prelude-direct/types.txt+1−1 tests/golden/types-prelude-interface/about.txt+1−1 tests/golden/types-prelude-interface/types.txt+1−1 tests/golden/types-record-change-generic/about.txt+4 tests/golden/types-record-change-generic/modules.txt+1 tests/golden/types-record-change-generic/source.jibb+11 tests/golden/types-record-change-generic/tokens.txt+169 tests/golden/types-record-change-generic/tree.txt+66 tests/golden/types-record-change-generic/types.txt+16 tests/golden/types-record-change/about.txt+4 tests/golden/types-record-change/modules.txt+1 tests/golden/types-record-change/source.jibb+19 tests/golden/types-record-change/tokens.txt+254 tests/golden/types-record-change/tree.txt+99 tests/golden/types-record-change/types.txt+42 tests/golden/types-tuple-context-nested/about.txt+4 tests/golden/types-tuple-context-nested/modules.txt+1 tests/golden/types-tuple-context-nested/source.jibb+24 tests/golden/types-tuple-context-nested/tokens.txt+289 tests/golden/types-tuple-context-nested/tree.txt+140 tests/golden/types-tuple-context-nested/types.txt+55 tests/golden/types-tuple-context/about.txt+4 tests/golden/types-tuple-context/modules.txt+1 tests/golden/types-tuple-context/source.jibb+7 tests/golden/types-tuple-context/tokens.txt+109 tests/golden/types-tuple-context/tree.txt+55 tests/golden/types-tuple-context/types.txt+14 tests/lib/jibb.hoon+277−252
docs/compiler.md+3−1
@@ -60,11 +60,13 @@ The inference fragment supports fixed auras, unrestricted `@`, one-way widening
6060
6161String interpolation infers its pieces in order and preserves substitutions and pending constraints. A piece with a known atom aura, unrestricted `@`, or a tape `(list @tD)` is accepted; an isolated decimal literal takes its normal `@ud` default. A known cell reports that it needs a printer, and an explicitly generic atom asks for an aura at its use site. Loobeans, term singletons, non-tape collections, open types and a type fixed only later remain unsupported in this fragment.
6262
63+A change can replace uniquely named fields on a fully known, faced record spine, including through a nested wing. Replacements receive the field type as context, substitutions and pending constraints are retained, and the resulting type remains the original record. Missing fields, empty changes and definite replacement mismatches report sites; the expected-type site is the edit, since the original field declaration location is not retained. Unknown or partly unfaced spines, ambiguous fields and repeated edits remain unsupported. The cart-store example’s `update` infers in this fragment; store kind and declaration checking remain unfinished.
64+
6365For supported closed unions, the type printer keeps the union’s origin separate from its displayed name. It prints an in-scope name such as `msg` or `msg.lib`, including in records and gates; an accessible imported nongeneric alias may name a transitive union. A nongeneric body-local union that escapes its scope, or an origin without an accessible name, prints its cases separated by spaces, parenthesized when nested. That case-list form is print-only. A supported generic union prints its name and all arguments, including unused arguments; when its name is unavailable, the partial printer reports that limitation instead of dropping its arguments. Two faces for the same imported origin remain compatible; compatibility between distinct union origins, including in gate types, remains unsupported. Some comparisons of generic union arguments also remain unsupported rather than deciding equality or mismatch. The Hoon bridge also translates some imported unnamed unions into this representation; unsupported cases remain errors.
6466
6567Multi-argument calls form one right-nested sample: `f a b c` supplies `[a [b c]]`, with the last argument able to be a cell itself. The fragment fits the complete sample, preserving known faces and shared variables. Known sample positions can provide list or union context to arguments; unknown sample shapes use ordinary inference and some contextual forms remain unsupported. For a definite mismatch, the diagnostic points to a specific argument when it can establish which one failed; otherwise it reports the combined sample.
6668
67−A list literal can be inferred when a cast or known gate sample supplies a list type and the supplied prelude has the validated standard list definition. Empty, nonempty and nested literals work, including contextual union tags in elements; mismatched elements report the item and expected type. Imported Hoon lists share this representation. Under the same known context, `~` and zero-valued term literals fit an empty list, and a two-item unfaced cell `[head tail]` is a cons; cons cells and list literals can be nested. Mismatched heads or tails report both sites. A known list result also supplies context through complete loobean, unit-shaped and list-shaped branches, including recursive and nested branches. A zero nested inside a single tuple argument where a list is expected also remains unsupported, rather than a definite mismatch; separate call arguments can receive list context. Faced or longer cells, uncontextualized construction, and a missing or altered prelude list remain unsupported. For a known standard list with a supported element type, it also infers a complete two-arm branch using `~` and `[item rest]`, in either order. The binders have the element and list types and cannot shadow or duplicate names. Unknown subjects, unsupported element types, other patterns and incomplete arms remain unsupported.
69+A list literal can be inferred when a cast or known gate sample supplies a list type and the supplied prelude has the validated standard list definition. Empty, nonempty and nested literals work, including contextual union tags in elements; mismatched elements report the item and expected type. Imported Hoon lists share this representation. Under the same known context, `~` and zero-valued term literals fit an empty list, and a two-item unfaced cell `[head tail]` is a cons; cons cells and list literals can be nested. Mismatched heads or tails report both sites. A known list result also supplies context through complete loobean, unit-shaped and list-shaped branches, including recursive and nested branches. A known gate sample also supplies context to corresponding positions of a single tuple or record argument, including nested cells; a zero literal can therefore fit a list position. A bound zero constant still remains unsupported rather than a definite mismatch, and an unknown callee does not supply context. Faced or longer cells, uncontextualized construction, and a missing or altered prelude list remain unsupported. For a known standard list with a supported element type, it also infers a complete two-arm branch using `~` and `[item rest]`, in either order. The binders have the element and list types and cannot shadow or duplicate names. Unknown subjects, unsupported element types, other patterns and incomplete arms remain unsupported.
6870
6971A known union of `~` and a null-headed cell can be matched by `~` and `[~ value]` arms in either order. The payload binder is checked for shadowing. Unknown subjects, missing or duplicate arms, and unresolved branch results remain unsupported; this fragment infers the prelude’s `fall` and `need` signatures.
7072
docs/status.md+7−6
@@ -19,7 +19,7 @@ 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 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 selected Hoon atoms, term singletons, 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 cross as opaque module-and-name identities; aliases, foreign references, recursive marks, unfolding and construction remain unsupported. The reader handles mark samples, recursive molds whose origins can be verified through Ford imports, nested collections, direct ordered maps, 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. 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, and detects missing sources and cycles. It does not yet check API or kind semantics, and 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. 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. Local mutual groups, polymorphic recursion, value cycles, 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. 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, some complex two-arm subjects and contextual union-pattern branches remain unsupported. The Grammar’s `step` block infers in this fragment, but its module is not yet checked. 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 zero nested inside a single tuple argument where a list is expected remains unsupported rather than a definite mismatch. 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. Uncontextualized list construction, 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; mutually recursive local groups and 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.
22+The 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 selected Hoon atoms, term singletons, 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 cross as opaque module-and-name identities; aliases, foreign references, recursive marks, unfolding and construction remain unsupported. The reader handles mark samples, recursive molds whose origins can be verified through Ford imports, nested collections, direct ordered maps, 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. 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, and detects missing sources and cycles. It does not yet check API or kind semantics, and 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. 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. Local mutual groups, polymorphic recursion, value cycles, 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. 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, some complex two-arm subjects and contextual union-pattern branches remain unsupported. The Grammar’s `step` block infers in this fragment, but its module is not yet checked. 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. The cart-store example’s `update` now infers, while its kind, declarations and full module remain unchecked. 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. Uncontextualized list construction, 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; mutually recursive local groups and 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.
2323
2424The shared prelude interface reserves every name present in the supplied vendored source and makes only supported inferred entries available, including `list`, `unit`, `same`, `fall`, `need`, `lure`, `weld`, `snoc` and `turn`. The validated standard `list` mold is injected when the prelude’s own gates are inferred; `weld` and `turn` have ordinary explicit result casts. An absent or altered `list` is not injected, and an altered declaration cannot leak through direct or transitive mold aliases. List-dependent prelude mold aliases remain unsupported because their templates are prepared before injection. Unsupported entries such as most list helpers remain reserved but unavailable; backend validation of the helpers remains outstanding. All callers use the same prelude origin, so a library can export a type containing unqualified `(unit A)` to another module. Preparation rejects empty, malformed, conflicting or import-bearing source; the prepared value is trusted and must come unchanged from `+prepare-prelude`. The module-scope fixture compares the prepared and source-taking paths against the real prelude and a two-module golden under eval and on the ship. The source and checker remain incomplete, so this does not establish complete shadowing coverage or a checked module.
2525
@@ -39,8 +39,8 @@ What the plan asks for, and where it is:
3939
4040Besides the plan's list:
4141
42−- 529 golden cases: 313 that parse and 216 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.
43−- The 529-case corpus passed under `urbit eval` in 64.5 s. The fake ship passed all 535 tests, including the importer, importer/checker and mark/checker bridges, module scope and unification checks, with 33.2 s for sync and 37.6 s for tests. The importer golden compares 149 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.
42+- 533 golden cases: 317 that parse and 216 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.
43+- The 533-case corpus passed under `urbit eval` in 64.1 s. The fake ship passed all 539 tests, including the importer, importer/checker and mark/checker bridges, module scope and unification checks, with 33.1 s for sync and 38.0 s for tests. The importer golden compares 149 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.
4444- `tools/testdata/selftest` (22 checks) and `tools/testdata/ship-selftest` test the tools themselves.
4545- 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.
4646- 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).
@@ -95,14 +95,15 @@ Besides the plan's list:
9595| 98c19cd | 2026-10-30 | Infer known-aura string interpolation |
9696| ddba633 | 2026-10-30 | Infer top-level mutually recursive gates |
9797| 9f1517e | 2026-10-30 | Infer whole-case union patterns and prelude `turn` |
98−| This change | 2026-10-31 | Match finite boolean refinements of union cases |
98+| 9dd35c8 | 2026-10-31 | Match finite boolean refinements of union cases |
99+| This change | 2026-10-31 | Contextualize tuple calls and infer known record changes |
99100
100101## Checking it
101102
102103On a machine set up as [development.md](development.md) says:
103104
104105```
105−tools/golden # 529 cases under urbit eval
106+tools/golden # 533 cases under urbit eval
106107tools/importer-test # the Hoon importer fixture projection
107108tools/type-import-test # the importer/checker bridge fixture
108109tools/type-mark-test # the mark/checker bridge fixture
@@ -112,7 +113,7 @@ tools/testdata/selftest # the tools themselves
112113tools/doc-blocks docs/spec # the doc's examples are golden cases
113114tools/ship start
114115tools/ship gen-tests --check # tests/lib/jibb.hoon is up to date
115−tools/ship test # the same 529 cases as -test arms on the ship
116+tools/ship test # the same 533 cases as -test arms on the ship
116117tools/testdata/ship-selftest
117118tools/ship check-commit # |commit stores .jibb files
118119tools/clay-fixtures # example /sur files and marks build through Clay
jibb-dev/lib/jibb.hoon+66−6
@@ -6904,6 +6904,40 @@
69046904 ?. ?=(%union -.typ) ~
69056905 `typ
69066906::
6907+:: Infer changes only against a fully known record spine. Retain the
6908+:: target type; unknown spines and repeated edits remain unsupported.
6909+++ change-spine-known
6910+ |= [t=itype sub=isub]
6911+ ^- ?
6912+ =. t (itype-walk t sub)
6913+ ?: ?=(%face -.t) &
6914+ ?. ?=(%cell -.t) |
6915+ =/ first=itype (itype-walk hed.t sub)
6916+ ?. ?=(%face -.first) |
6917+ $(t tal.t)
6918+::
6919+++ infer-change-edits
6920+ |= [edits=(list edit) target=itype env=ienv state=istate seen=(list term)]
6921+ ^- iresult
6922+ ?~ edits [%& target state]
6923+ =/ entry=edit i.edits
6924+ ?: (lien seen |=(name=term =(name name.entry)))
6925+ [%| ["repeated change fields are not supported by partial inference" ~]]
6926+ ?. (change-spine-known target sub.state)
6927+ [%| ["change target needs a known record in partial inference" ~]]
6928+ =/ found=(list itype) (record-fields-named name.entry target sub.state)
6929+ ?~ found
6930+ [%| ["record has no field `{(trip name.entry)}`" ~[[at.entry "unknown field"]]]]
6931+ ?^ t.found [%| ["change field is ambiguous in partial inference" ~]]
6932+ =/ expected=itype i.found
6933+ =/ value=iresult (infer-call-context-arg val.entry expected env state at.entry)
6934+ ?: ?=(%| -.value) value
6935+ =/ fit=ifit (itype-fit typ.p.value expected sub.state.p.value next.state.p.value)
6936+ ?: ?=(%unknown -.fit) [%| ["change field constraint is not supported by partial inference" ~]]
6937+ ?: ?=(%bad -.fit)
6938+ [%| ["change field and replacement do not unify" ~[[at.entry (site-type-note "expected replacement" expected sub.state.p.value)] [(span-of val.entry) (site-type-note "replacement" typ.p.value sub.state.p.value)]]]]
6939+ $(edits t.edits, state state.p.value(sub sub.fit, next next.fit), seen [name.entry seen])
6940+::
69076941++ infer-fragment
69086942 |= [e=expr env=ienv state=istate]
69096943 ^- iresult
@@ -6943,6 +6977,11 @@
69436977 =/ instance=[typ=itype state=istate] (instantiate-scheme u.scheme state)
69446978 [%& typ.instance state.instance]
69456979 %group $(e inner.e)
6980+ %change
6981+ ?~ edits.e [%| ["a change takes at least one field" ~[[at.e "empty change"]]]]
6982+ =/ target=iresult $(e [%wing at.e target.e])
6983+ ?: ?=(%| -.target) target
6984+ (infer-change-edits edits.e typ.p.target env state.p.target ~)
69466985 %ctor [%& [%tag next.state tag.e &] state(next +(next.state), tags [[next.state tag.e] tags.state])]
69476986 %trace
69486987 =/ traced=iresult $(e val.e)
@@ -7064,12 +7103,8 @@
70647103 ?: ?=(%fn -.head-type)
70657104 (infer-call-context-args args.e sample.head-type env state.p.head (span-of head.e))
70667105 (infer-simple-items (turn args.e |=(a=expr [(span-of a) ~ a])) env state.p.head)
7067− ?: &(?=(%fn -.head-type) ?=(%union -.sample.head-type) (context-union-branch i.args.e))
7068− (infer-union-context i.args.e sample.head-type env state.p.head (span-of head.e))
7069− ?: &(?=(%fn -.head-type) ?=(%collection -.sample.head-type) =(%list name.sample.head-type) (context-union-branch i.args.e))
7070− (infer-union-context i.args.e sample.head-type env state.p.head (span-of head.e))
7071− ?: &(?=(%fn -.head-type) ?=(%collection -.sample.head-type) =(%list name.sample.head-type) (context-list-expression i.args.e))
7072− (infer-list-context i.args.e sample.head-type env state.p.head (span-of head.e))
7106+ ?: ?=(%fn -.head-type)
7107+ (infer-call-context-arg i.args.e sample.head-type env state.p.head (span-of head.e))
70737108 $(e i.args.e, state state.p.head)
70747109 ?: ?=(%| -.arg) arg
70757110 =/ st=istate state.p.arg
@@ -7135,8 +7170,33 @@
71357170 (infer-union-context e target env state context)
71367171 ?: &(?=(%collection -.target) =(%list name.target) (context-list-expression e))
71377172 (infer-list-context e target env state context)
7173+ ?: &(?=(%cell -.target) ?=(%tuple -.e))
7174+ (infer-call-context-items items.e target env state context)
71387175 (infer-fragment e env state)
71397176::
7177+:: Preserve each written face; the final complete sample fit checks faces.
7178+++ infer-call-context-items
7179+ |= [items=(list item) expected=itype env=ienv state=istate context=span]
7180+ ^- iresult
7181+ ?~ items [%| ["empty cell is not supported by partial inference" ~]]
7182+ ?~ t.items
7183+ =/ last=iresult (infer-call-context-arg val.i.items expected env state context)
7184+ ?: ?=(%| -.last) last
7185+ =/ typ=itype typ.p.last
7186+ =. typ ?~(face.i.items typ [%face u.face.i.items typ])
7187+ [%& typ state.p.last]
7188+ =/ target=itype (itype-walk expected sub.state)
7189+ |-
7190+ ?: ?=(%face -.target) $(target (itype-walk body.target sub.state))
7191+ ?. ?=(%cell -.target) (infer-simple-items items env state)
7192+ =/ head=iresult (infer-call-context-arg val.i.items hed.target env state context)
7193+ ?: ?=(%| -.head) head
7194+ =/ typ=itype typ.p.head
7195+ =. typ ?~(face.i.items typ [%face u.face.i.items typ])
7196+ =/ tail=iresult (infer-call-context-items t.items tal.target env state.p.head context)
7197+ ?: ?=(%| -.tail) tail
7198+ [%& [%cell typ typ.p.tail] state.p.tail]
7199+::
71407200++ infer-call-context-args
71417201 |= [args=(list expr) expected=itype env=ienv state=istate context=span]
71427202 ^- iresult
tests/golden/doc-grammar-06-cart-store/about.txt+1
@@ -1,3 +1,4 @@
11source: Grammar tab, section "Example: a store and an island", code block 6 of the tab (block 5 is the EBNF)
22tests: a store module: a record mold with a mold application and the loobean mold `?`; a union with its cases below; a mold that is a name; a blank line; `++ main (store init update)`; a cast with its mold and expression on one line, `^- state [~ %.n]`; a gate with a cell sample; `?-` arms whose expressions are changes, `s(items=[item items.s])` and `s(open=(not open.s))`
33expect: parses
4+expect-types: a partial inference report
tests/golden/doc-grammar-06-cart-store/modules.txtnew file+1
@@ -0,0 +1 @@
1+# no module fixtures
tests/golden/doc-grammar-06-cart-store/types.txtnew file+7
@@ -0,0 +1,7 @@
1+partial inference; module not checked
2++$ state: not checked
3++$ cart-action: cases proven disjoint; mold not checked
4++$ poke: not checked
5+++ main: name is not available to partial inference
6+++ init: cast constraint is not supported by partial inference
7+++ update: $-([a=cart-action s=[items=(list @t) open=?]] [items=(list @t) open=?])
tests/golden/types-list-zero-fit/about.txt+1−1
@@ -1,4 +1,4 @@
11source: Grammar, Literals: `~` is "A constant: the `~` case of any union with one, such as `(unit A)`, `(list A)`, `(map K V)` or `(set A)`".
2−tests: A zero-valued literal or constant nested in a tuple supplied to a list sample is not a definite mismatch; this partial checker does not yet propagate the list context into that tuple. Nonzero atoms and passing an arbitrary list where the zero constant is required remain definite mismatches. Separate call arguments do receive list context, and the prelude `turn` tuple also fails closed.
2+tests: Zero-valued literals nested in a tuple supplied to a list sample receive list context; a bound zero constant remains unsupported rather than a definite mismatch. Nonzero atoms and passing an arbitrary list where the zero constant is required remain definite mismatches. Separate call arguments receive list context, and the prelude `turn` tuple infers.
33expect: parses
44expect-types: a partial inference report
tests/golden/types-list-zero-fit/types.txt+3−3
@@ -1,6 +1,6 @@
11partial inference; module not checked
2−++ nil-arg: call constraint is not supported by partial inference
3−++ zero-arg: call constraint is not supported by partial inference
2+++ nil-arg: $-($-([(list @t) @t] @t) @t)
3+++ zero-arg: $-($-([(list @t) @t] @t) @t)
44++ zero-one-arg: call's sample and argument types do not unify
55/tests/golden/types-list-zero-fit/source.jibb:3:45: called gate has type $-([(list @t) @t] @t)
66++ zero-one-arg |= f=$-([(list @t) @t] @t) (f [%1 "ok"])
@@ -24,4 +24,4 @@ partial inference; module not checked
2424/tests/golden/types-list-zero-fit/source.jibb:7:45: argument has type (list @t)
2525++ reverse |= [f=$-(%$ @t) xs=(list @t)] (f xs)
2626 ^
27−++ turn-tuple: call constraint is not supported by partial inference
27+++ turn-tuple: (list A)
tests/golden/types-prelude-direct/about.txt+1−1
@@ -1,4 +1,4 @@
11source: Overview, Prelude: "Hoon's standard library regrouped, written in Jibb and vendored as `/lib/jibb/prelude`". Grammar, Modules: no name may shadow one already in scope.
2−tests: A module with no imports uses the prelude's unit and need, printing unit without a qualifier. The prelude `turn` is available, but a list zero nested inside a single tuple argument remains unsupported instead of reporting a false mismatch. Prelude names remain reserved.
2+tests: A module with no imports uses the prelude's unit and need, printing unit without a qualifier. The prelude `turn` is available, and list context reaches a zero nested inside its single tuple argument. Prelude names remain reserved.
33expect: parses
44expect-types: a partial inference report
tests/golden/types-prelude-direct/types.txt+1−1
@@ -2,5 +2,5 @@ partial inference; module not checked
22++ echo: $-((unit A) (unit A))
33++ extract: $-((unit A) A)
44++ concrete: (unit @t)
5−++ tuple-call: call constraint is not supported by partial inference
5+++ tuple-call: (list A)
66++ shadow: sample shadows a name
tests/golden/types-prelude-interface/about.txt+1−1
@@ -1,4 +1,4 @@
11source: Overview, Prelude: "Hoon's standard library regrouped, written in Jibb and vendored as `/lib/jibb/prelude`". Grammar, Modules: no name may shadow one already in scope.
2−tests: A unit constructed in one module passes through another module's generic identity and the root's prelude helpers, preserving one origin and printing `unit` unqualified. The prelude list mold is available; a zero inside a single tuple passed to `turn` remains unsupported instead of reporting a false mismatch, and a sample cannot shadow a prelude name.
2+tests: A unit constructed in one module passes through another module's generic identity and the root's prelude helpers, preserving one origin and printing `unit` unqualified. The prelude list mold is available; a zero inside a single tuple passed to `turn` receives list context, and a sample cannot shadow a prelude name.
33expect: parses
44expect-types: a partial inference report
tests/golden/types-prelude-interface/types.txt+1−1
@@ -3,7 +3,7 @@ partial inference; module not checked
33++ source: (unit @t)
44++ direct: @t
55++ fallback: @t
6−++ tuple-call: call constraint is not supported by partial inference
6+++ tuple-call: (list A)
77++ shadow: sample shadows a name
88++ list-id: $-((list @t) (list @t))
99++ get-gate: $-((unit A) (unit A))
tests/golden/types-record-change-generic/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar, Molds: "Type variables are capitals, generalized per `++`"; Modules: no name may shadow one already in scope.
2+tests: A replacement preserves shared generic field variables; forcing a written capital concrete stays unsupported and a mismatched replacement reports both sites. Unrelated tags and invalid expressions stay visible; repeated edits and ambiguous faces fail closed.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/types-record-change-generic/modules.txtnew file+1
@@ -0,0 +1 @@
1+# no module fixtures
tests/golden/types-record-change-generic/source.jibbnew file+11
@@ -0,0 +1,11 @@
1++$ box |$ [A] [value=A keep=A]
2+++ keep |= [s=(box A) v=A] s(value=v)
3+++ force |= s=(box A) s(value="constant")
4+++ mixed |= [s=(box @t) v=@p] s(value=v)
5+++ duplicate |= [s=(box @t) v=@t] s(value=v value=v)
6+++ unrelated |= [s=(box @t) v=@t]
7+ ~& %orphan
8+ s(value=v)
9+++ invalid-value |= [s=(box @t) v=@t] s(value=missing)
10++$ ambiguous [same=@t same=@p]
11+++ ambiguous-field |= s=ambiguous s(same="x")
tests/golden/types-record-change-generic/tokens.txtnew file+169
@@ -0,0 +1,169 @@
1+1:1 glyph +$
2+1:4 name box
3+1:8 glyph |$
4+1:11 glyph [
5+1:12 tight tvar A
6+1:13 tight glyph ]
7+1:15 glyph [
8+1:16 tight name value
9+1:21 tight glyph =
10+1:22 tight tvar A
11+1:24 name keep
12+1:28 tight glyph =
13+1:29 tight tvar A
14+1:30 tight glyph ]
15+2:1 NEWLINE
16+2:1 glyph ++
17+2:4 name keep
18+2:9 glyph |=
19+2:12 glyph [
20+2:13 tight name s
21+2:14 tight glyph =
22+2:15 tight glyph (
23+2:16 tight name box
24+2:20 tvar A
25+2:21 tight glyph )
26+2:23 name v
27+2:24 tight glyph =
28+2:25 tight tvar A
29+2:26 tight glyph ]
30+2:28 name s
31+2:29 tight glyph (
32+2:30 tight name value
33+2:35 tight glyph =
34+2:36 tight name v
35+2:37 tight glyph )
36+3:1 NEWLINE
37+3:1 glyph ++
38+3:4 name force
39+3:10 glyph |=
40+3:13 name s
41+3:14 tight glyph =
42+3:15 tight glyph (
43+3:16 tight name box
44+3:20 tvar A
45+3:21 tight glyph )
46+3:23 name s
47+3:24 tight glyph (
48+3:25 tight name value
49+3:30 tight glyph =
50+3:31 tight str "constant"
51+3:41 tight glyph )
52+4:1 NEWLINE
53+4:1 glyph ++
54+4:4 name mixed
55+4:10 glyph |=
56+4:13 glyph [
57+4:14 tight name s
58+4:15 tight glyph =
59+4:16 tight glyph (
60+4:17 tight name box
61+4:21 aura @t
62+4:23 tight glyph )
63+4:25 name v
64+4:26 tight glyph =
65+4:27 tight aura @p
66+4:29 tight glyph ]
67+4:31 name s
68+4:32 tight glyph (
69+4:33 tight name value
70+4:38 tight glyph =
71+4:39 tight name v
72+4:40 tight glyph )
73+5:1 NEWLINE
74+5:1 glyph ++
75+5:4 name duplicate
76+5:14 glyph |=
77+5:17 glyph [
78+5:18 tight name s
79+5:19 tight glyph =
80+5:20 tight glyph (
81+5:21 tight name box
82+5:25 aura @t
83+5:27 tight glyph )
84+5:29 name v
85+5:30 tight glyph =
86+5:31 tight aura @t
87+5:33 tight glyph ]
88+5:35 name s
89+5:36 tight glyph (
90+5:37 tight name value
91+5:42 tight glyph =
92+5:43 tight name v
93+5:45 name value
94+5:50 tight glyph =
95+5:51 tight name v
96+5:52 tight glyph )
97+6:1 NEWLINE
98+6:1 glyph ++
99+6:4 name unrelated
100+6:14 glyph |=
101+6:17 glyph [
102+6:18 tight name s
103+6:19 tight glyph =
104+6:20 tight glyph (
105+6:21 tight name box
106+6:25 aura @t
107+6:27 tight glyph )
108+6:29 name v
109+6:30 tight glyph =
110+6:31 tight aura @t
111+6:33 tight glyph ]
112+7:3 INDENT
113+7:3 glyph ~&
114+7:6 lit %orphan
115+8:5 INDENT
116+8:5 name s
117+8:6 tight glyph (
118+8:7 tight name value
119+8:12 tight glyph =
120+8:13 tight name v
121+8:14 tight glyph )
122+9:1 DEDENT
123+9:1 DEDENT
124+9:1 NEWLINE
125+9:1 glyph ++
126+9:4 name invalid-value
127+9:18 glyph |=
128+9:21 glyph [
129+9:22 tight name s
130+9:23 tight glyph =
131+9:24 tight glyph (
132+9:25 tight name box
133+9:29 aura @t
134+9:31 tight glyph )
135+9:33 name v
136+9:34 tight glyph =
137+9:35 tight aura @t
138+9:37 tight glyph ]
139+9:39 name s
140+9:40 tight glyph (
141+9:41 tight name value
142+9:46 tight glyph =
143+9:47 tight name missing
144+9:54 tight glyph )
145+10:1 NEWLINE
146+10:1 glyph +$
147+10:4 name ambiguous
148+10:14 glyph [
149+10:15 tight name same
150+10:19 tight glyph =
151+10:20 tight aura @t
152+10:23 name same
153+10:27 tight glyph =
154+10:28 tight aura @p
155+10:30 tight glyph ]
156+11:1 NEWLINE
157+11:1 glyph ++
158+11:4 name ambiguous-field
159+11:20 glyph |=
160+11:23 name s
161+11:24 tight glyph =
162+11:25 tight name ambiguous
163+11:35 name s
164+11:36 tight glyph (
165+11:37 tight name same
166+11:41 tight glyph =
167+11:42 tight str "x"
168+11:45 tight glyph )
169+11:46 NEWLINE
tests/golden/types-record-change-generic/tree.txtnew file+66
@@ -0,0 +1,66 @@
1+(module
2+ (mold 1:1 box
3+ (generic 1:8 A
4+ (cell 1:15
5+ (face 1:16 value (tvar 1:22 A))
6+ (face 1:24 keep (tvar 1:29 A)))))
7+ (value 2:1 keep
8+ (gate 2:9
9+ (cell 2:12
10+ (face 2:13 s
11+ (apply 2:15 box (tvar 2:20 A)))
12+ (face 2:23 v (tvar 2:25 A)))
13+ (change 2:28 s
14+ (edit 2:30 value (wing 2:36 v)))))
15+ (value 3:1 force
16+ (gate 3:10
17+ (face 3:13 s
18+ (apply 3:15 box (tvar 3:20 A)))
19+ (change 3:23 s
20+ (edit 3:25 value (str 3:31 "constant")))))
21+ (value 4:1 mixed
22+ (gate 4:10
23+ (cell 4:13
24+ (face 4:14 s
25+ (apply 4:16 box (aura 4:21 @t)))
26+ (face 4:25 v (aura 4:27 @p)))
27+ (change 4:31 s
28+ (edit 4:33 value (wing 4:39 v)))))
29+ (value 5:1 duplicate
30+ (gate 5:14
31+ (cell 5:17
32+ (face 5:18 s
33+ (apply 5:20 box (aura 5:25 @t)))
34+ (face 5:29 v (aura 5:31 @t)))
35+ (change 5:35 s
36+ (edit 5:37 value (wing 5:43 v))
37+ (edit 5:45 value (wing 5:51 v)))))
38+ (value 6:1 unrelated
39+ (gate 6:14
40+ (cell 6:17
41+ (face 6:18 s
42+ (apply 6:20 box (aura 6:25 @t)))
43+ (face 6:29 v (aura 6:31 @t)))
44+ (body 7:3
45+ (trace 7:3
46+ (lit 7:6 %orphan)
47+ (body 8:5
48+ (change 8:5 s
49+ (edit 8:7 value (wing 8:13 v))))))))
50+ (value 9:1 invalid-value
51+ (gate 9:18
52+ (cell 9:21
53+ (face 9:22 s
54+ (apply 9:24 box (aura 9:29 @t)))
55+ (face 9:33 v (aura 9:35 @t)))
56+ (change 9:39 s
57+ (edit 9:41 value (wing 9:47 missing)))))
58+ (mold 10:1 ambiguous
59+ (cell 10:14
60+ (face 10:15 same (aura 10:20 @t))
61+ (face 10:23 same (aura 10:28 @p))))
62+ (value 11:1 ambiguous-field
63+ (gate 11:20
64+ (face 11:23 s (ref 11:25 ambiguous))
65+ (change 11:35 s
66+ (edit 11:37 same (str 11:42 "x"))))))
tests/golden/types-record-change-generic/types.txtnew file+16
@@ -0,0 +1,16 @@
1+partial inference; module not checked
2++$ box: not checked
3+++ keep: $-([s=[value=A keep=A] v=A] [value=A keep=A])
4+++ force: explicit capital constraints are not supported by partial inference
5+++ mixed: change field and replacement do not unify
6+/tests/golden/types-record-change-generic/source.jibb:4:33: expected replacement has type @t
7+++ mixed |= [s=(box @t) v=@p] s(value=v)
8+ ^
9+/tests/golden/types-record-change-generic/source.jibb:4:39: replacement has type @p
10+++ mixed |= [s=(box @t) v=@p] s(value=v)
11+ ^
12+++ duplicate: repeated change fields are not supported by partial inference
13+++ unrelated: tag needs context in partial inference
14+++ invalid-value: name is not available to partial inference
15++$ ambiguous: not checked
16+++ ambiguous-field: change field is ambiguous in partial inference
tests/golden/types-record-change/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar, Expressions: "A change takes one or more of the same items, as `m(done=%.y)`; `m()` is an error"; Tag resolution: tags and `~` take their type from context.
2+tests: Known record fields can be changed, including nested targets, multiple fields, list cons/zero and union tags. Missing fields, invalid replacements and empty changes report sites; unknown and partially unfaced targets fail closed. Replacement errors identify the edit and value, not the original field declaration.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/types-record-change/modules.txtnew file+1
@@ -0,0 +1 @@
1+# no module fixtures
tests/golden/types-record-change/source.jibbnew file+19
@@ -0,0 +1,19 @@
1++$ state [items=(list @t) open=? name=@t nested=[word=@t]]
2++$ actions
3+ %start
4+ %stop
5++$ model [mode=actions data=(unit @t)]
6+++ flip |= s=state s(open=(not open.s))
7+++ put |= [s=state item=@t] s(items=[item items.s])
8+++ clear |= s=state s(items=~ name="")
9+++ multiple |= s=state s(name="ok" open=%.y)
10+++ nested |= s=state nested.s(word="hello")
11+++ no-field |= s=state s(missing="bad")
12+++ mismatch |= s=state s(name=~zod)
13+++ wrong-list |= s=state s(items=[~zod items.s])
14+++ unknown |= x x(name="ok")
15+++ empty |= s=state s()
16+++ tag |= m=model m(mode=%start data=~)
17+++ bad-tag |= m=model m(mode=%missing)
18+++ unfaced |= s=[@t @p] s(name="ok")
19+++ mixed-spine |= s=[name=@t @p] s(name="ok")
tests/golden/types-record-change/tokens.txtnew file+254
@@ -0,0 +1,254 @@
1+1:1 glyph +$
2+1:4 name state
3+1:10 glyph [
4+1:11 tight name items
5+1:16 tight glyph =
6+1:17 tight glyph (
7+1:18 tight name list
8+1:23 aura @t
9+1:25 tight glyph )
10+1:27 name open
11+1:31 tight glyph =
12+1:32 tight glyph ?
13+1:34 name name
14+1:38 tight glyph =
15+1:39 tight aura @t
16+1:42 name nested
17+1:48 tight glyph =
18+1:49 tight glyph [
19+1:50 tight name word
20+1:54 tight glyph =
21+1:55 tight aura @t
22+1:57 tight glyph ]
23+1:58 tight glyph ]
24+2:1 NEWLINE
25+2:1 glyph +$
26+2:4 name actions
27+3:3 INDENT
28+3:3 lit %start
29+4:3 NEWLINE
30+4:3 lit %stop
31+5:1 DEDENT
32+5:1 NEWLINE
33+5:1 glyph +$
34+5:4 name model
35+5:10 glyph [
36+5:11 tight name mode
37+5:15 tight glyph =
38+5:16 tight name actions
39+5:24 name data
40+5:28 tight glyph =
41+5:29 tight glyph (
42+5:30 tight name unit
43+5:35 aura @t
44+5:37 tight glyph )
45+5:38 tight glyph ]
46+6:1 NEWLINE
47+6:1 glyph ++
48+6:4 name flip
49+6:9 glyph |=
50+6:12 name s
51+6:13 tight glyph =
52+6:14 tight name state
53+6:20 name s
54+6:21 tight glyph (
55+6:22 tight name open
56+6:26 tight glyph =
57+6:27 tight glyph (
58+6:28 tight name not
59+6:32 wing open.s
60+6:38 tight glyph )
61+6:39 tight glyph )
62+7:1 NEWLINE
63+7:1 glyph ++
64+7:4 name put
65+7:8 glyph |=
66+7:11 glyph [
67+7:12 tight name s
68+7:13 tight glyph =
69+7:14 tight name state
70+7:20 name item
71+7:24 tight glyph =
72+7:25 tight aura @t
73+7:27 tight glyph ]
74+7:29 name s
75+7:30 tight glyph (
76+7:31 tight name items
77+7:36 tight glyph =
78+7:37 tight glyph [
79+7:38 tight name item
80+7:43 wing items.s
81+7:50 tight glyph ]
82+7:51 tight glyph )
83+8:1 NEWLINE
84+8:1 glyph ++
85+8:4 name clear
86+8:10 glyph |=
87+8:13 name s
88+8:14 tight glyph =
89+8:15 tight name state
90+8:21 name s
91+8:22 tight glyph (
92+8:23 tight name items
93+8:28 tight glyph =
94+8:29 tight lit ~
95+8:31 name name
96+8:35 tight glyph =
97+8:36 tight str ""
98+8:38 tight glyph )
99+9:1 NEWLINE
100+9:1 glyph ++
101+9:4 name multiple
102+9:13 glyph |=
103+9:16 name s
104+9:17 tight glyph =
105+9:18 tight name state
106+9:24 name s
107+9:25 tight glyph (
108+9:26 tight name name
109+9:30 tight glyph =
110+9:31 tight str "ok"
111+9:36 name open
112+9:40 tight glyph =
113+9:41 tight lit %.y
114+9:44 tight glyph )
115+10:1 NEWLINE
116+10:1 glyph ++
117+10:4 name nested
118+10:11 glyph |=
119+10:14 name s
120+10:15 tight glyph =
121+10:16 tight name state
122+10:22 wing nested.s
123+10:30 tight glyph (
124+10:31 tight name word
125+10:35 tight glyph =
126+10:36 tight str "hello"
127+10:43 tight glyph )
128+11:1 NEWLINE
129+11:1 glyph ++
130+11:4 name no-field
131+11:13 glyph |=
132+11:16 name s
133+11:17 tight glyph =
134+11:18 tight name state
135+11:24 name s
136+11:25 tight glyph (
137+11:26 tight name missing
138+11:33 tight glyph =
139+11:34 tight str "bad"
140+11:39 tight glyph )
141+12:1 NEWLINE
142+12:1 glyph ++
143+12:4 name mismatch
144+12:13 glyph |=
145+12:16 name s
146+12:17 tight glyph =
147+12:18 tight name state
148+12:24 name s
149+12:25 tight glyph (
150+12:26 tight name name
151+12:30 tight glyph =
152+12:31 tight lit ~zod
153+12:35 tight glyph )
154+13:1 NEWLINE
155+13:1 glyph ++
156+13:4 name wrong-list
157+13:15 glyph |=
158+13:18 name s
159+13:19 tight glyph =
160+13:20 tight name state
161+13:26 name s
162+13:27 tight glyph (
163+13:28 tight name items
164+13:33 tight glyph =
165+13:34 tight glyph [
166+13:35 tight lit ~zod
167+13:40 wing items.s
168+13:47 tight glyph ]
169+13:48 tight glyph )
170+14:1 NEWLINE
171+14:1 glyph ++
172+14:4 name unknown
173+14:12 glyph |=
174+14:15 name x
175+14:17 name x
176+14:18 tight glyph (
177+14:19 tight name name
178+14:23 tight glyph =
179+14:24 tight str "ok"
180+14:28 tight glyph )
181+15:1 NEWLINE
182+15:1 glyph ++
183+15:4 name empty
184+15:10 glyph |=
185+15:13 name s
186+15:14 tight glyph =
187+15:15 tight name state
188+15:21 name s
189+15:22 tight glyph (
190+15:23 tight glyph )
191+16:1 NEWLINE
192+16:1 glyph ++
193+16:4 name tag
194+16:8 glyph |=
195+16:11 name m
196+16:12 tight glyph =
197+16:13 tight name model
198+16:19 name m
199+16:20 tight glyph (
200+16:21 tight name mode
201+16:25 tight glyph =
202+16:26 tight lit %start
203+16:33 name data
204+16:37 tight glyph =
205+16:38 tight lit ~
206+16:39 tight glyph )
207+17:1 NEWLINE
208+17:1 glyph ++
209+17:4 name bad-tag
210+17:12 glyph |=
211+17:15 name m
212+17:16 tight glyph =
213+17:17 tight name model
214+17:23 name m
215+17:24 tight glyph (
216+17:25 tight name mode
217+17:29 tight glyph =
218+17:30 tight lit %missing
219+17:38 tight glyph )
220+18:1 NEWLINE
221+18:1 glyph ++
222+18:4 name unfaced
223+18:12 glyph |=
224+18:15 name s
225+18:16 tight glyph =
226+18:17 tight glyph [
227+18:18 tight aura @t
228+18:21 aura @p
229+18:23 tight glyph ]
230+18:25 name s
231+18:26 tight glyph (
232+18:27 tight name name
233+18:31 tight glyph =
234+18:32 tight str "ok"
235+18:36 tight glyph )
236+19:1 NEWLINE
237+19:1 glyph ++
238+19:4 name mixed-spine
239+19:16 glyph |=
240+19:19 name s
241+19:20 tight glyph =
242+19:21 tight glyph [
243+19:22 tight name name
244+19:26 tight glyph =
245+19:27 tight aura @t
246+19:30 aura @p
247+19:32 tight glyph ]
248+19:34 name s
249+19:35 tight glyph (
250+19:36 tight name name
251+19:40 tight glyph =
252+19:41 tight str "ok"
253+19:45 tight glyph )
254+19:46 NEWLINE
tests/golden/types-record-change/tree.txtnew file+99
@@ -0,0 +1,99 @@
1+(module
2+ (mold 1:1 state
3+ (cell 1:10
4+ (face 1:11 items
5+ (apply 1:17 list (aura 1:23 @t)))
6+ (face 1:27 open (flag 1:32))
7+ (face 1:34 name (aura 1:39 @t))
8+ (face 1:42 nested
9+ (cell 1:49
10+ (face 1:50 word (aura 1:55 @t))))))
11+ (mold 2:1 actions
12+ (union 3:3 (const 3:3 %start) (const 4:3 %stop)))
13+ (mold 5:1 model
14+ (cell 5:10
15+ (face 5:11 mode (ref 5:16 actions))
16+ (face 5:24 data
17+ (apply 5:29 unit (aura 5:35 @t)))))
18+ (value 6:1 flip
19+ (gate 6:9
20+ (face 6:12 s (ref 6:14 state))
21+ (change 6:20 s
22+ (edit 6:22 open
23+ (group 6:27
24+ (call 6:28 (wing 6:28 not) (wing 6:32 open.s)))))))
25+ (value 7:1 put
26+ (gate 7:8
27+ (cell 7:11
28+ (face 7:12 s (ref 7:14 state))
29+ (face 7:20 item (aura 7:25 @t)))
30+ (change 7:29 s
31+ (edit 7:31 items
32+ (tuple 7:37 (wing 7:38 item) (wing 7:43 items.s))))))
33+ (value 8:1 clear
34+ (gate 8:10
35+ (face 8:13 s (ref 8:15 state))
36+ (change 8:21 s
37+ (edit 8:23 items (lit 8:29 ~))
38+ (edit 8:31 name (str 8:36 "")))))
39+ (value 9:1 multiple
40+ (gate 9:13
41+ (face 9:16 s (ref 9:18 state))
42+ (change 9:24 s
43+ (edit 9:26 name (str 9:31 "ok"))
44+ (edit 9:36 open (lit 9:41 %.y)))))
45+ (value 10:1 nested
46+ (gate 10:11
47+ (face 10:14 s (ref 10:16 state))
48+ (change 10:22 nested.s
49+ (edit 10:31 word (str 10:36 "hello")))))
50+ (value 11:1 no-field
51+ (gate 11:13
52+ (face 11:16 s (ref 11:18 state))
53+ (change 11:24 s
54+ (edit 11:26 missing (str 11:34 "bad")))))
55+ (value 12:1 mismatch
56+ (gate 12:13
57+ (face 12:16 s (ref 12:18 state))
58+ (change 12:24 s
59+ (edit 12:26 name (lit 12:31 ~zod)))))
60+ (value 13:1 wrong-list
61+ (gate 13:15
62+ (face 13:18 s (ref 13:20 state))
63+ (change 13:26 s
64+ (edit 13:28 items
65+ (tuple 13:34 (lit 13:35 ~zod) (wing 13:40 items.s))))))
66+ (value 14:1 unknown
67+ (gate 14:12
68+ (bind 14:15 x)
69+ (change 14:17 x
70+ (edit 14:19 name (str 14:24 "ok")))))
71+ (value 15:1 empty
72+ (gate 15:10
73+ (face 15:13 s (ref 15:15 state))
74+ (change 15:21 s)))
75+ (value 16:1 tag
76+ (gate 16:8
77+ (face 16:11 m (ref 16:13 model))
78+ (change 16:19 m
79+ (edit 16:21 mode (lit 16:26 %start))
80+ (edit 16:33 data (lit 16:38 ~)))))
81+ (value 17:1 bad-tag
82+ (gate 17:12
83+ (face 17:15 m (ref 17:17 model))
84+ (change 17:23 m
85+ (edit 17:25 mode (lit 17:30 %missing)))))
86+ (value 18:1 unfaced
87+ (gate 18:12
88+ (face 18:15 s
89+ (cell 18:17 (aura 18:18 @t) (aura 18:21 @p)))
90+ (change 18:25 s
91+ (edit 18:27 name (str 18:32 "ok")))))
92+ (value 19:1 mixed-spine
93+ (gate 19:16
94+ (face 19:19 s
95+ (cell 19:21
96+ (face 19:22 name (aura 19:27 @t))
97+ (aura 19:30 @p)))
98+ (change 19:34 s
99+ (edit 19:36 name (str 19:41 "ok"))))))
tests/golden/types-record-change/types.txtnew file+42
@@ -0,0 +1,42 @@
1+partial inference; module not checked
2++$ state: not checked
3++$ actions: cases proven disjoint; mold not checked
4++$ model: not checked
5+++ flip: $-([items=(list @t) [open=? [name=@t nested=[word=@t]]]] [items=(list @t) [open=? [name=@t nested=[word=@t]]]])
6+++ put: $-([s=[items=(list @t) [open=? [name=@t nested=[word=@t]]]] item=@t] [items=(list @t) [open=? [name=@t nested=[word=@t]]]])
7+++ clear: $-([items=(list @t) [open=? [name=@t nested=[word=@t]]]] [items=(list @t) [open=? [name=@t nested=[word=@t]]]])
8+++ multiple: $-([items=(list @t) [open=? [name=@t nested=[word=@t]]]] [items=(list @t) [open=? [name=@t nested=[word=@t]]]])
9+++ nested: $-([items=(list @t) [open=? [name=@t nested=[word=@t]]]] [word=@t])
10+++ no-field: record has no field `missing`
11+/tests/golden/types-record-change/source.jibb:11:26: unknown field
12+++ no-field |= s=state s(missing="bad")
13+ ^
14+++ mismatch: change field and replacement do not unify
15+/tests/golden/types-record-change/source.jibb:12:26: expected replacement has type @t
16+++ mismatch |= s=state s(name=~zod)
17+ ^
18+/tests/golden/types-record-change/source.jibb:12:31: replacement has type @p
19+++ mismatch |= s=state s(name=~zod)
20+ ^
21+++ wrong-list: list item does not fit its expected type
22+/tests/golden/types-record-change/source.jibb:13:28: expected item has type @t
23+++ wrong-list |= s=state s(items=[~zod items.s])
24+ ^
25+/tests/golden/types-record-change/source.jibb:13:35: list item has type @p
26+++ wrong-list |= s=state s(items=[~zod items.s])
27+ ^
28+++ unknown: change target needs a known record in partial inference
29+++ empty: a change takes at least one field
30+/tests/golden/types-record-change/source.jibb:15:21: empty change
31+++ empty |= s=state s()
32+ ^
33+++ tag: $-([mode=actions data=(unit @t)] [mode=actions data=(unit @t)])
34+++ bad-tag: change field and replacement do not unify
35+/tests/golden/types-record-change/source.jibb:17:25: expected replacement
36+++ bad-tag |= m=model m(mode=%missing)
37+ ^
38+/tests/golden/types-record-change/source.jibb:17:30: replacement
39+++ bad-tag |= m=model m(mode=%missing)
40+ ^
41+++ unfaced: change target needs a known record in partial inference
42+++ mixed-spine: change target needs a known record in partial inference
tests/golden/types-tuple-context-nested/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar, Literals by context: tags and null take their type from context; Molds: faces are part of record types and distinct specific auras do not unify.
2+tests: Context passes through nested faced records to union tags, lists and case constructors. Wrong tags, faces, counts, later list items, repeated generic parameters and constructors fail with sites. An unknown callee and unrelated pending tag or null remain unresolved.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/types-tuple-context-nested/modules.txtnew file+1
@@ -0,0 +1 @@
1+# no module fixtures
tests/golden/types-tuple-context-nested/source.jibbnew file+24
@@ -0,0 +1,24 @@
1++$ msg
2+ %go
3+ %stay
4+++ take |= p=[payload=msg xs=(list @t)] p
5+++ ok (take [payload=%go xs=~])
6+++ bad-tag (take [payload=%oops xs=~])
7+++ bad-face (take [wrong=%go xs=~])
8+++ extra (take [payload=%go xs=~ extra="x"])
9+++ nest |= p=[data=[payload=msg xs=(list @t)] z=@p] p
10+++ nested (nest [data=[payload=%stay xs=~] z=~zod])
11+++ unconstrained |= f (f [payload=%go xs=~])
12+++ pending
13+ ~& %unused
14+ (take [payload=%go xs=~])
15+++ wrong-item (take [payload=%go xs=~[~zod]])
16+++ discarded-null
17+ ~& ~
18+ (take [payload=%go xs=~])
19+++ generic |= p=[left=A right=A] p
20+++ generic-bad (generic [left=~zod right="hi"])
21++$ typed [%typed text=@t]
22+++ use-ctor |= p=[f=$-(@t typed) payload=@t] p
23+++ constructor (use-ctor [f=|=%typed payload="hi"])
24+++ bad-constructor (use-ctor [f=|=%other payload="hi"])
tests/golden/types-tuple-context-nested/tokens.txtnew file+289
@@ -0,0 +1,289 @@
1+1:1 glyph +$
2+1:4 name msg
3+2:3 INDENT
4+2:3 lit %go
5+3:3 NEWLINE
6+3:3 lit %stay
7+4:1 DEDENT
8+4:1 NEWLINE
9+4:1 glyph ++
10+4:4 name take
11+4:9 glyph |=
12+4:12 name p
13+4:13 tight glyph =
14+4:14 tight glyph [
15+4:15 tight name payload
16+4:22 tight glyph =
17+4:23 tight name msg
18+4:27 name xs
19+4:29 tight glyph =
20+4:30 tight glyph (
21+4:31 tight name list
22+4:36 aura @t
23+4:38 tight glyph )
24+4:39 tight glyph ]
25+4:41 name p
26+5:1 NEWLINE
27+5:1 glyph ++
28+5:4 name ok
29+5:7 glyph (
30+5:8 tight name take
31+5:13 glyph [
32+5:14 tight name payload
33+5:21 tight glyph =
34+5:22 tight lit %go
35+5:26 name xs
36+5:28 tight glyph =
37+5:29 tight lit ~
38+5:30 tight glyph ]
39+5:31 tight glyph )
40+6:1 NEWLINE
41+6:1 glyph ++
42+6:4 name bad-tag
43+6:12 glyph (
44+6:13 tight name take
45+6:18 glyph [
46+6:19 tight name payload
47+6:26 tight glyph =
48+6:27 tight lit %oops
49+6:33 name xs
50+6:35 tight glyph =
51+6:36 tight lit ~
52+6:37 tight glyph ]
53+6:38 tight glyph )
54+7:1 NEWLINE
55+7:1 glyph ++
56+7:4 name bad-face
57+7:13 glyph (
58+7:14 tight name take
59+7:19 glyph [
60+7:20 tight name wrong
61+7:25 tight glyph =
62+7:26 tight lit %go
63+7:30 name xs
64+7:32 tight glyph =
65+7:33 tight lit ~
66+7:34 tight glyph ]
67+7:35 tight glyph )
68+8:1 NEWLINE
69+8:1 glyph ++
70+8:4 name extra
71+8:10 glyph (
72+8:11 tight name take
73+8:16 glyph [
74+8:17 tight name payload
75+8:24 tight glyph =
76+8:25 tight lit %go
77+8:29 name xs
78+8:31 tight glyph =
79+8:32 tight lit ~
80+8:34 name extra
81+8:39 tight glyph =
82+8:40 tight str "x"
83+8:43 tight glyph ]
84+8:44 tight glyph )
85+9:1 NEWLINE
86+9:1 glyph ++
87+9:4 name nest
88+9:9 glyph |=
89+9:12 name p
90+9:13 tight glyph =
91+9:14 tight glyph [
92+9:15 tight name data
93+9:19 tight glyph =
94+9:20 tight glyph [
95+9:21 tight name payload
96+9:28 tight glyph =
97+9:29 tight name msg
98+9:33 name xs
99+9:35 tight glyph =
100+9:36 tight glyph (
101+9:37 tight name list
102+9:42 aura @t
103+9:44 tight glyph )
104+9:45 tight glyph ]
105+9:47 name z
106+9:48 tight glyph =
107+9:49 tight aura @p
108+9:51 tight glyph ]
109+9:53 name p
110+10:1 NEWLINE
111+10:1 glyph ++
112+10:4 name nested
113+10:11 glyph (
114+10:12 tight name nest
115+10:17 glyph [
116+10:18 tight name data
117+10:22 tight glyph =
118+10:23 tight glyph [
119+10:24 tight name payload
120+10:31 tight glyph =
121+10:32 tight lit %stay
122+10:38 name xs
123+10:40 tight glyph =
124+10:41 tight lit ~
125+10:42 tight glyph ]
126+10:44 name z
127+10:45 tight glyph =
128+10:46 tight lit ~zod
129+10:50 tight glyph ]
130+10:51 tight glyph )
131+11:1 NEWLINE
132+11:1 glyph ++
133+11:4 name unconstrained
134+11:18 glyph |=
135+11:21 name f
136+11:23 glyph (
137+11:24 tight name f
138+11:26 glyph [
139+11:27 tight name payload
140+11:34 tight glyph =
141+11:35 tight lit %go
142+11:39 name xs
143+11:41 tight glyph =
144+11:42 tight lit ~
145+11:43 tight glyph ]
146+11:44 tight glyph )
147+12:1 NEWLINE
148+12:1 glyph ++
149+12:4 name pending
150+13:3 INDENT
151+13:3 glyph ~&
152+13:6 lit %unused
153+14:5 INDENT
154+14:5 glyph (
155+14:6 tight name take
156+14:11 glyph [
157+14:12 tight name payload
158+14:19 tight glyph =
159+14:20 tight lit %go
160+14:24 name xs
161+14:26 tight glyph =
162+14:27 tight lit ~
163+14:28 tight glyph ]
164+14:29 tight glyph )
165+15:1 DEDENT
166+15:1 DEDENT
167+15:1 NEWLINE
168+15:1 glyph ++
169+15:4 name wrong-item
170+15:15 glyph (
171+15:16 tight name take
172+15:21 glyph [
173+15:22 tight name payload
174+15:29 tight glyph =
175+15:30 tight lit %go
176+15:34 name xs
177+15:36 tight glyph =
178+15:37 tight glyph ~[
179+15:39 tight lit ~zod
180+15:43 tight glyph ]
181+15:44 tight glyph ]
182+15:45 tight glyph )
183+16:1 NEWLINE
184+16:1 glyph ++
185+16:4 name discarded-null
186+17:3 INDENT
187+17:3 glyph ~&
188+17:6 lit ~
189+18:5 INDENT
190+18:5 glyph (
191+18:6 tight name take
192+18:11 glyph [
193+18:12 tight name payload
194+18:19 tight glyph =
195+18:20 tight lit %go
196+18:24 name xs
197+18:26 tight glyph =
198+18:27 tight lit ~
199+18:28 tight glyph ]
200+18:29 tight glyph )
201+19:1 DEDENT
202+19:1 DEDENT
203+19:1 NEWLINE
204+19:1 glyph ++
205+19:4 name generic
206+19:12 glyph |=
207+19:15 name p
208+19:16 tight glyph =
209+19:17 tight glyph [
210+19:18 tight name left
211+19:22 tight glyph =
212+19:23 tight tvar A
213+19:25 name right
214+19:30 tight glyph =
215+19:31 tight tvar A
216+19:32 tight glyph ]
217+19:34 name p
218+20:1 NEWLINE
219+20:1 glyph ++
220+20:4 name generic-bad
221+20:16 glyph (
222+20:17 tight name generic
223+20:25 glyph [
224+20:26 tight name left
225+20:30 tight glyph =
226+20:31 tight lit ~zod
227+20:36 name right
228+20:41 tight glyph =
229+20:42 tight str "hi"
230+20:46 tight glyph ]
231+20:47 tight glyph )
232+21:1 NEWLINE
233+21:1 glyph +$
234+21:4 name typed
235+21:10 glyph [
236+21:11 tight lit %typed
237+21:18 name text
238+21:22 tight glyph =
239+21:23 tight aura @t
240+21:25 tight glyph ]
241+22:1 NEWLINE
242+22:1 glyph ++
243+22:4 name use-ctor
244+22:13 glyph |=
245+22:16 name p
246+22:17 tight glyph =
247+22:18 tight glyph [
248+22:19 tight name f
249+22:20 tight glyph =
250+22:21 tight glyph $-(
251+22:24 tight aura @t
252+22:27 name typed
253+22:32 tight glyph )
254+22:34 name payload
255+22:41 tight glyph =
256+22:42 tight aura @t
257+22:44 tight glyph ]
258+22:46 name p
259+23:1 NEWLINE
260+23:1 glyph ++
261+23:4 name constructor
262+23:16 glyph (
263+23:17 tight name use-ctor
264+23:26 glyph [
265+23:27 tight name f
266+23:28 tight glyph =
267+23:29 tight glyph |=
268+23:31 tight lit %typed
269+23:38 name payload
270+23:45 tight glyph =
271+23:46 tight str "hi"
272+23:50 tight glyph ]
273+23:51 tight glyph )
274+24:1 NEWLINE
275+24:1 glyph ++
276+24:4 name bad-constructor
277+24:20 glyph (
278+24:21 tight name use-ctor
279+24:30 glyph [
280+24:31 tight name f
281+24:32 tight glyph =
282+24:33 tight glyph |=
283+24:35 tight lit %other
284+24:42 name payload
285+24:49 tight glyph =
286+24:50 tight str "hi"
287+24:54 tight glyph ]
288+24:55 tight glyph )
289+24:56 NEWLINE
tests/golden/types-tuple-context-nested/tree.txtnew file+140
@@ -0,0 +1,140 @@
1+(module
2+ (mold 1:1 msg
3+ (union 2:3 (const 2:3 %go) (const 3:3 %stay)))
4+ (value 4:1 take
5+ (gate 4:9
6+ (face 4:12 p
7+ (cell 4:14
8+ (face 4:15 payload (ref 4:23 msg))
9+ (face 4:27 xs
10+ (apply 4:30 list (aura 4:36 @t)))))
11+ (wing 4:41 p)))
12+ (value 5:1 ok
13+ (group 5:7
14+ (call 5:8
15+ (wing 5:8 take)
16+ (tuple 5:13
17+ (face 5:14 payload (lit 5:22 %go))
18+ (face 5:26 xs (lit 5:29 ~))))))
19+ (value 6:1 bad-tag
20+ (group 6:12
21+ (call 6:13
22+ (wing 6:13 take)
23+ (tuple 6:18
24+ (face 6:19 payload (lit 6:27 %oops))
25+ (face 6:33 xs (lit 6:36 ~))))))
26+ (value 7:1 bad-face
27+ (group 7:13
28+ (call 7:14
29+ (wing 7:14 take)
30+ (tuple 7:19
31+ (face 7:20 wrong (lit 7:26 %go))
32+ (face 7:30 xs (lit 7:33 ~))))))
33+ (value 8:1 extra
34+ (group 8:10
35+ (call 8:11
36+ (wing 8:11 take)
37+ (tuple 8:16
38+ (face 8:17 payload (lit 8:25 %go))
39+ (face 8:29 xs (lit 8:32 ~))
40+ (face 8:34 extra (str 8:40 "x"))))))
41+ (value 9:1 nest
42+ (gate 9:9
43+ (face 9:12 p
44+ (cell 9:14
45+ (face 9:15 data
46+ (cell 9:20
47+ (face 9:21 payload (ref 9:29 msg))
48+ (face 9:33 xs
49+ (apply 9:36 list (aura 9:42 @t)))))
50+ (face 9:47 z (aura 9:49 @p))))
51+ (wing 9:53 p)))
52+ (value 10:1 nested
53+ (group 10:11
54+ (call 10:12
55+ (wing 10:12 nest)
56+ (tuple 10:17
57+ (face 10:18 data
58+ (tuple 10:23
59+ (face 10:24 payload (lit 10:32 %stay))
60+ (face 10:38 xs (lit 10:41 ~))))
61+ (face 10:44 z (lit 10:46 ~zod))))))
62+ (value 11:1 unconstrained
63+ (gate 11:18
64+ (bind 11:21 f)
65+ (group 11:23
66+ (call 11:24
67+ (wing 11:24 f)
68+ (tuple 11:26
69+ (face 11:27 payload (lit 11:35 %go))
70+ (face 11:39 xs (lit 11:42 ~)))))))
71+ (value 12:1 pending
72+ (body 13:3
73+ (trace 13:3
74+ (lit 13:6 %unused)
75+ (body 14:5
76+ (group 14:5
77+ (call 14:6
78+ (wing 14:6 take)
79+ (tuple 14:11
80+ (face 14:12 payload (lit 14:20 %go))
81+ (face 14:24 xs (lit 14:27 ~)))))))))
82+ (value 15:1 wrong-item
83+ (group 15:15
84+ (call 15:16
85+ (wing 15:16 take)
86+ (tuple 15:21
87+ (face 15:22 payload (lit 15:30 %go))
88+ (face 15:34 xs
89+ (list 15:37 (lit 15:39 ~zod)))))))
90+ (value 16:1 discarded-null
91+ (body 17:3
92+ (trace 17:3
93+ (lit 17:6 ~)
94+ (body 18:5
95+ (group 18:5
96+ (call 18:6
97+ (wing 18:6 take)
98+ (tuple 18:11
99+ (face 18:12 payload (lit 18:20 %go))
100+ (face 18:24 xs (lit 18:27 ~)))))))))
101+ (value 19:1 generic
102+ (gate 19:12
103+ (face 19:15 p
104+ (cell 19:17
105+ (face 19:18 left (tvar 19:23 A))
106+ (face 19:25 right (tvar 19:31 A))))
107+ (wing 19:34 p)))
108+ (value 20:1 generic-bad
109+ (group 20:16
110+ (call 20:17
111+ (wing 20:17 generic)
112+ (tuple 20:25
113+ (face 20:26 left (lit 20:31 ~zod))
114+ (face 20:36 right (str 20:42 "hi"))))))
115+ (mold 21:1 typed
116+ (cell 21:10
117+ (const 21:11 %typed)
118+ (face 21:18 text (aura 21:23 @t))))
119+ (value 22:1 use-ctor
120+ (gate 22:13
121+ (face 22:16 p
122+ (cell 22:18
123+ (face 22:19 f
124+ (fn 22:21 (aura 22:24 @t) (ref 22:27 typed)))
125+ (face 22:34 payload (aura 22:42 @t))))
126+ (wing 22:46 p)))
127+ (value 23:1 constructor
128+ (group 23:16
129+ (call 23:17
130+ (wing 23:17 use-ctor)
131+ (tuple 23:26
132+ (face 23:27 f (ctor 23:29 %typed))
133+ (face 23:38 payload (str 23:46 "hi"))))))
134+ (value 24:1 bad-constructor
135+ (group 24:20
136+ (call 24:21
137+ (wing 24:21 use-ctor)
138+ (tuple 24:30
139+ (face 24:31 f (ctor 24:33 %other))
140+ (face 24:42 payload (str 24:50 "hi")))))))
tests/golden/types-tuple-context-nested/types.txtnew file+55
@@ -0,0 +1,55 @@
1+partial inference; module not checked
2++$ msg: cases proven disjoint; mold not checked
3+++ take: $-([payload=msg xs=(list @t)] [payload=msg xs=(list @t)])
4+++ ok: [payload=msg xs=(list @t)]
5+++ bad-tag: call's sample and argument types do not unify
6+/tests/golden/types-tuple-context-nested/source.jibb:6:13: called gate
7+++ bad-tag (take [payload=%oops xs=~])
8+ ^
9+/tests/golden/types-tuple-context-nested/source.jibb:6:18: argument
10+++ bad-tag (take [payload=%oops xs=~])
11+ ^
12+++ bad-face: call's sample and argument types do not unify
13+/tests/golden/types-tuple-context-nested/source.jibb:7:14: called gate
14+++ bad-face (take [wrong=%go xs=~])
15+ ^
16+/tests/golden/types-tuple-context-nested/source.jibb:7:19: argument
17+++ bad-face (take [wrong=%go xs=~])
18+ ^
19+++ extra: call's sample and argument types do not unify
20+/tests/golden/types-tuple-context-nested/source.jibb:8:11: called gate
21+++ extra (take [payload=%go xs=~ extra="x"])
22+ ^
23+/tests/golden/types-tuple-context-nested/source.jibb:8:16: argument
24+++ extra (take [payload=%go xs=~ extra="x"])
25+ ^
26+++ nest: $-([data=[payload=msg xs=(list @t)] z=@p] [data=[payload=msg xs=(list @t)] z=@p])
27+++ nested: [data=[payload=msg xs=(list @t)] z=@p]
28+++ unconstrained: `~` needs context in partial inference
29+++ pending: tag needs context in partial inference
30+++ wrong-item: list item does not fit its expected type
31+/tests/golden/types-tuple-context-nested/source.jibb:15:16: expected item has type @t
32+++ wrong-item (take [payload=%go xs=~[~zod]])
33+ ^
34+/tests/golden/types-tuple-context-nested/source.jibb:15:39: list item has type @p
35+++ wrong-item (take [payload=%go xs=~[~zod]])
36+ ^
37+++ discarded-null: `~` needs context in partial inference
38+++ generic: $-([left=A right=A] [left=A right=A])
39+++ generic-bad: call's sample and argument types do not unify
40+/tests/golden/types-tuple-context-nested/source.jibb:20:17: called gate has type $-([left=A right=A] [left=A right=A])
41+++ generic-bad (generic [left=~zod right="hi"])
42+ ^
43+/tests/golden/types-tuple-context-nested/source.jibb:20:25: argument has type [left=@p right=@t]
44+++ generic-bad (generic [left=~zod right="hi"])
45+ ^
46++$ typed: not checked
47+++ use-ctor: $-([f=$-(@t [%typed text=@t]) payload=@t] [f=$-(@t [%typed text=@t]) payload=@t])
48+++ constructor: [f=$-(@t [%typed text=@t]) payload=@t]
49+++ bad-constructor: call's sample and argument types do not unify
50+/tests/golden/types-tuple-context-nested/source.jibb:24:21: called gate has type $-([f=$-(@t [%typed text=@t]) payload=@t] [f=$-(@t [%typed text=@t]) payload=@t])
51+++ bad-constructor (use-ctor [f=|=%other payload="hi"])
52+ ^
53+/tests/golden/types-tuple-context-nested/source.jibb:24:30: argument
54+++ bad-constructor (use-ctor [f=|=%other payload="hi"])
55+ ^
tests/golden/types-tuple-context/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar, Literals: a cell is "A tuple; a record when faced; a cons where a list is expected"; Expressions: a call supplies its arguments to a gate's sample.
2+tests: A known sample supplies context to the positions of a single tuple argument, including an empty list and a gate. Explicit faces are retained, incompatible faces fail, and an unknown callee does not guess a list type.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/types-tuple-context/modules.txtnew file+1
@@ -0,0 +1 @@
1+# no module fixtures
tests/golden/types-tuple-context/source.jibbnew file+7
@@ -0,0 +1,7 @@
1+++ empty (turn [~ |=(x x)])
2+++ two (turn ~ |=(x x))
3+++ yes (turn [~["hi"] |=(x x)])
4+++ target |= p=[xs=(list @t) f=$-(@t @t)] p
5+++ faced (target [xs=~ f=|=(x x)])
6+++ wrong (target [items=~ f=|=(x x)])
7+++ unknown |= f (f [~ |=(x x)])
tests/golden/types-tuple-context/tokens.txtnew file+109
@@ -0,0 +1,109 @@
1+1:1 glyph ++
2+1:4 name empty
3+1:10 glyph (
4+1:11 tight name turn
5+1:16 glyph [
6+1:17 tight lit ~
7+1:19 glyph |=(
8+1:22 tight name x
9+1:24 name x
10+1:25 tight glyph )
11+1:26 tight glyph ]
12+1:27 tight glyph )
13+2:1 NEWLINE
14+2:1 glyph ++
15+2:4 name two
16+2:8 glyph (
17+2:9 tight name turn
18+2:14 lit ~
19+2:16 glyph |=(
20+2:19 tight name x
21+2:21 name x
22+2:22 tight glyph )
23+2:23 tight glyph )
24+3:1 NEWLINE
25+3:1 glyph ++
26+3:4 name yes
27+3:8 glyph (
28+3:9 tight name turn
29+3:14 glyph [
30+3:15 tight glyph ~[
31+3:17 tight str "hi"
32+3:21 tight glyph ]
33+3:23 glyph |=(
34+3:26 tight name x
35+3:28 name x
36+3:29 tight glyph )
37+3:30 tight glyph ]
38+3:31 tight glyph )
39+4:1 NEWLINE
40+4:1 glyph ++
41+4:4 name target
42+4:11 glyph |=
43+4:14 name p
44+4:15 tight glyph =
45+4:16 tight glyph [
46+4:17 tight name xs
47+4:19 tight glyph =
48+4:20 tight glyph (
49+4:21 tight name list
50+4:26 aura @t
51+4:28 tight glyph )
52+4:30 name f
53+4:31 tight glyph =
54+4:32 tight glyph $-(
55+4:35 tight aura @t
56+4:38 aura @t
57+4:40 tight glyph )
58+4:41 tight glyph ]
59+4:43 name p
60+5:1 NEWLINE
61+5:1 glyph ++
62+5:4 name faced
63+5:10 glyph (
64+5:11 tight name target
65+5:18 glyph [
66+5:19 tight name xs
67+5:21 tight glyph =
68+5:22 tight lit ~
69+5:24 name f
70+5:25 tight glyph =
71+5:26 tight glyph |=(
72+5:29 tight name x
73+5:31 name x
74+5:32 tight glyph )
75+5:33 tight glyph ]
76+5:34 tight glyph )
77+6:1 NEWLINE
78+6:1 glyph ++
79+6:4 name wrong
80+6:10 glyph (
81+6:11 tight name target
82+6:18 glyph [
83+6:19 tight name items
84+6:24 tight glyph =
85+6:25 tight lit ~
86+6:27 name f
87+6:28 tight glyph =
88+6:29 tight glyph |=(
89+6:32 tight name x
90+6:34 name x
91+6:35 tight glyph )
92+6:36 tight glyph ]
93+6:37 tight glyph )
94+7:1 NEWLINE
95+7:1 glyph ++
96+7:4 name unknown
97+7:12 glyph |=
98+7:15 name f
99+7:17 glyph (
100+7:18 tight name f
101+7:20 glyph [
102+7:21 tight lit ~
103+7:23 glyph |=(
104+7:26 tight name x
105+7:28 name x
106+7:29 tight glyph )
107+7:30 tight glyph ]
108+7:31 tight glyph )
109+7:32 NEWLINE
tests/golden/types-tuple-context/tree.txtnew file+55
@@ -0,0 +1,55 @@
1+(module
2+ (value 1:1 empty
3+ (group 1:10
4+ (call 1:11
5+ (wing 1:11 turn)
6+ (tuple 1:16
7+ (lit 1:17 ~)
8+ (gate-wide 1:19 (bind 1:22 x) (wing 1:24 x))))))
9+ (value 2:1 two
10+ (group 2:8
11+ (call 2:9
12+ (wing 2:9 turn)
13+ (lit 2:14 ~)
14+ (gate-wide 2:16 (bind 2:19 x) (wing 2:21 x)))))
15+ (value 3:1 yes
16+ (group 3:8
17+ (call 3:9
18+ (wing 3:9 turn)
19+ (tuple 3:14
20+ (list 3:15 (str 3:17 "hi"))
21+ (gate-wide 3:23 (bind 3:26 x) (wing 3:28 x))))))
22+ (value 4:1 target
23+ (gate 4:11
24+ (face 4:14 p
25+ (cell 4:16
26+ (face 4:17 xs
27+ (apply 4:20 list (aura 4:26 @t)))
28+ (face 4:30 f
29+ (fn 4:32 (aura 4:35 @t) (aura 4:38 @t)))))
30+ (wing 4:43 p)))
31+ (value 5:1 faced
32+ (group 5:10
33+ (call 5:11
34+ (wing 5:11 target)
35+ (tuple 5:18
36+ (face 5:19 xs (lit 5:22 ~))
37+ (face 5:24 f
38+ (gate-wide 5:26 (bind 5:29 x) (wing 5:31 x)))))))
39+ (value 6:1 wrong
40+ (group 6:10
41+ (call 6:11
42+ (wing 6:11 target)
43+ (tuple 6:18
44+ (face 6:19 items (lit 6:25 ~))
45+ (face 6:27 f
46+ (gate-wide 6:29 (bind 6:32 x) (wing 6:34 x)))))))
47+ (value 7:1 unknown
48+ (gate 7:12
49+ (bind 7:15 f)
50+ (group 7:17
51+ (call 7:18
52+ (wing 7:18 f)
53+ (tuple 7:20
54+ (lit 7:21 ~)
55+ (gate-wide 7:23 (bind 7:26 x) (wing 7:28 x))))))))
tests/golden/types-tuple-context/types.txtnew file+14
@@ -0,0 +1,14 @@
1+partial inference; module not checked
2+++ empty: (list A)
3+++ two: (list A)
4+++ yes: (list @t)
5+++ target: $-([xs=(list @t) f=$-(@t @t)] [xs=(list @t) f=$-(@t @t)])
6+++ faced: [xs=(list @t) f=$-(@t @t)]
7+++ wrong: call's sample and argument types do not unify
8+/tests/golden/types-tuple-context/source.jibb:6:11: called gate has type $-([xs=(list @t) f=$-(@t @t)] [xs=(list @t) f=$-(@t @t)])
9+++ wrong (target [items=~ f=|=(x x)])
10+ ^
11+/tests/golden/types-tuple-context/source.jibb:6:18: argument has type [items=(list @t) f=$-(A A)]
12+++ wrong (target [items=~ f=|=(x x)])
13+ ^
14+++ unknown: `~` needs context in partial inference
tests/lib/jibb.hoon+277−252
@@ -40,6 +40,7 @@
4040/* src-6 %jibb /tests/golden/doc-grammar-06-cart-store/source/jibb
4141/* tok-6 %txt /tests/golden/doc-grammar-06-cart-store/tokens/txt
4242/* tre-6 %txt /tests/golden/doc-grammar-06-cart-store/tree/txt
43+/* typ-6 %txt /tests/golden/doc-grammar-06-cart-store/types/txt
4344/* src-7 %jibb /tests/golden/doc-grammar-07-basket/source/jibb
4445/* tok-7 %txt /tests/golden/doc-grammar-07-basket/tokens/txt
4546/* tre-7 %txt /tests/golden/doc-grammar-07-basket/tree/txt
@@ -1683,211 +1684,227 @@
16831684/* tok-483 %txt /tests/golden/types-record-bound-variable/tokens/txt
16841685/* tre-483 %txt /tests/golden/types-record-bound-variable/tree/txt
16851686/* typ-483 %txt /tests/golden/types-record-bound-variable/types/txt
1686−/* src-484 %jibb /tests/golden/types-record-faces/source/jibb
1687−/* tok-484 %txt /tests/golden/types-record-faces/tokens/txt
1688−/* tre-484 %txt /tests/golden/types-record-faces/tree/txt
1689−/* typ-484 %txt /tests/golden/types-record-faces/types/txt
1690−/* src-485 %jibb /tests/golden/types-record-import/source/jibb
1691−/* tok-485 %txt /tests/golden/types-record-import/tokens/txt
1692−/* tre-485 %txt /tests/golden/types-record-import/tree/txt
1693−/* mod-485-1 %jibb /tests/golden/types-record-import/modules/ui/lib/jibb
1694−/* typ-485 %txt /tests/golden/types-record-import/types/txt
1695−/* mtre-485 %txt /tests/golden/types-record-import/module-trees/txt
1696−/* src-486 %jibb /tests/golden/types-record-local-scheme/source/jibb
1697−/* tok-486 %txt /tests/golden/types-record-local-scheme/tokens/txt
1698−/* tre-486 %txt /tests/golden/types-record-local-scheme/tree/txt
1699−/* typ-486 %txt /tests/golden/types-record-local-scheme/types/txt
1700−/* src-487 %jibb /tests/golden/types-record-nested/source/jibb
1701−/* tok-487 %txt /tests/golden/types-record-nested/tokens/txt
1702−/* tre-487 %txt /tests/golden/types-record-nested/tree/txt
1703−/* typ-487 %txt /tests/golden/types-record-nested/types/txt
1704−/* src-488 %jibb /tests/golden/types-record-to-tuple/source/jibb
1705−/* tok-488 %txt /tests/golden/types-record-to-tuple/tokens/txt
1706−/* tre-488 %txt /tests/golden/types-record-to-tuple/tree/txt
1707−/* typ-488 %txt /tests/golden/types-record-to-tuple/types/txt
1708−/* src-489 %jibb /tests/golden/types-recursion-scc-failures/source/jibb
1709−/* tok-489 %txt /tests/golden/types-recursion-scc-failures/tokens/txt
1710−/* tre-489 %txt /tests/golden/types-recursion-scc-failures/tree/txt
1711−/* typ-489 %txt /tests/golden/types-recursion-scc-failures/types/txt
1712−/* src-490 %jibb /tests/golden/types-recursion-scc-groups/source/jibb
1713−/* tok-490 %txt /tests/golden/types-recursion-scc-groups/tokens/txt
1714−/* tre-490 %txt /tests/golden/types-recursion-scc-groups/tree/txt
1715−/* typ-490 %txt /tests/golden/types-recursion-scc-groups/types/txt
1716−/* src-491 %jibb /tests/golden/types-recursion-scc-import/source/jibb
1717−/* tok-491 %txt /tests/golden/types-recursion-scc-import/tokens/txt
1718−/* tre-491 %txt /tests/golden/types-recursion-scc-import/tree/txt
1719−/* mod-491-1 %jibb /tests/golden/types-recursion-scc-import/modules/ui/lib/jibb
1720−/* typ-491 %txt /tests/golden/types-recursion-scc-import/types/txt
1721−/* mtre-491 %txt /tests/golden/types-recursion-scc-import/module-trees/txt
1722−/* src-492 %jibb /tests/golden/types-recursion-scc-import-bad/source/jibb
1723−/* tok-492 %txt /tests/golden/types-recursion-scc-import-bad/tokens/txt
1724−/* tre-492 %txt /tests/golden/types-recursion-scc-import-bad/tree/txt
1725−/* mod-492-1 %jibb /tests/golden/types-recursion-scc-import-bad/modules/ui/lib/jibb
1726−/* typ-492 %txt /tests/golden/types-recursion-scc-import-bad/types/txt
1727−/* mtre-492 %txt /tests/golden/types-recursion-scc-import-bad/module-trees/txt
1728−/* src-493 %jibb /tests/golden/types-recursion-scc-local/source/jibb
1729−/* tok-493 %txt /tests/golden/types-recursion-scc-local/tokens/txt
1730−/* tre-493 %txt /tests/golden/types-recursion-scc-local/tree/txt
1731−/* typ-493 %txt /tests/golden/types-recursion-scc-local/types/txt
1732−/* src-494 %jibb /tests/golden/types-recursion-scc-order/source/jibb
1733−/* tok-494 %txt /tests/golden/types-recursion-scc-order/tokens/txt
1734−/* tre-494 %txt /tests/golden/types-recursion-scc-order/tree/txt
1735−/* typ-494 %txt /tests/golden/types-recursion-scc-order/types/txt
1736−/* src-495 %jibb /tests/golden/types-recursion-scc-shadow/source/jibb
1737−/* tok-495 %txt /tests/golden/types-recursion-scc-shadow/tokens/txt
1738−/* tre-495 %txt /tests/golden/types-recursion-scc-shadow/tree/txt
1739−/* typ-495 %txt /tests/golden/types-recursion-scc-shadow/types/txt
1740−/* src-496 %jibb /tests/golden/types-recursive-branch/source/jibb
1741−/* tok-496 %txt /tests/golden/types-recursive-branch/tokens/txt
1742−/* tre-496 %txt /tests/golden/types-recursive-branch/tree/txt
1743−/* typ-496 %txt /tests/golden/types-recursive-branch/types/txt
1744−/* src-497 %jibb /tests/golden/types-recursive-gate/source/jibb
1745−/* tok-497 %txt /tests/golden/types-recursive-gate/tokens/txt
1746−/* tre-497 %txt /tests/golden/types-recursive-gate/tree/txt
1747−/* typ-497 %txt /tests/golden/types-recursive-gate/types/txt
1748−/* src-498 %jibb /tests/golden/types-recursive-sample/source/jibb
1749−/* tok-498 %txt /tests/golden/types-recursive-sample/tokens/txt
1750−/* tre-498 %txt /tests/golden/types-recursive-sample/tree/txt
1751−/* typ-498 %txt /tests/golden/types-recursive-sample/types/txt
1752−/* src-499 %jibb /tests/golden/types-string-interpolation/source/jibb
1753−/* tok-499 %txt /tests/golden/types-string-interpolation/tokens/txt
1754−/* tre-499 %txt /tests/golden/types-string-interpolation/tree/txt
1755−/* typ-499 %txt /tests/golden/types-string-interpolation/types/txt
1756−/* src-500 %jibb /tests/golden/types-union-alias/source/jibb
1757−/* tok-500 %txt /tests/golden/types-union-alias/tokens/txt
1758−/* tre-500 %txt /tests/golden/types-union-alias/tree/txt
1759−/* typ-500 %txt /tests/golden/types-union-alias/types/txt
1760−/* src-501 %jibb /tests/golden/types-union-branch-context/source/jibb
1761−/* tok-501 %txt /tests/golden/types-union-branch-context/tokens/txt
1762−/* tre-501 %txt /tests/golden/types-union-branch-context/tree/txt
1763−/* typ-501 %txt /tests/golden/types-union-branch-context/types/txt
1764−/* src-502 %jibb /tests/golden/types-union-branch-pending/source/jibb
1765−/* tok-502 %txt /tests/golden/types-union-branch-pending/tokens/txt
1766−/* tre-502 %txt /tests/golden/types-union-branch-pending/tree/txt
1767−/* typ-502 %txt /tests/golden/types-union-branch-pending/types/txt
1768−/* src-503 %jibb /tests/golden/types-union-constructor-shape/source/jibb
1769−/* tok-503 %txt /tests/golden/types-union-constructor-shape/tokens/txt
1770−/* tre-503 %txt /tests/golden/types-union-constructor-shape/tree/txt
1771−/* typ-503 %txt /tests/golden/types-union-constructor-shape/types/txt
1772−/* src-504 %jibb /tests/golden/types-union-context-flow/source/jibb
1773−/* tok-504 %txt /tests/golden/types-union-context-flow/tokens/txt
1774−/* tre-504 %txt /tests/golden/types-union-context-flow/tree/txt
1775−/* typ-504 %txt /tests/golden/types-union-context-flow/types/txt
1776−/* src-505 %jibb /tests/golden/types-union-finite/source/jibb
1777−/* tok-505 %txt /tests/golden/types-union-finite/tokens/txt
1778−/* tre-505 %txt /tests/golden/types-union-finite/tree/txt
1779−/* typ-505 %txt /tests/golden/types-union-finite/types/txt
1780−/* src-506 %jibb /tests/golden/types-union-finite-generic/source/jibb
1781−/* tok-506 %txt /tests/golden/types-union-finite-generic/tokens/txt
1782−/* tre-506 %txt /tests/golden/types-union-finite-generic/tree/txt
1783−/* typ-506 %txt /tests/golden/types-union-finite-generic/types/txt
1784−/* src-507 %jibb /tests/golden/types-union-finite-limit/source/jibb
1785−/* tok-507 %txt /tests/golden/types-union-finite-limit/tokens/txt
1786−/* tre-507 %txt /tests/golden/types-union-finite-limit/tree/txt
1787−/* typ-507 %txt /tests/golden/types-union-finite-limit/types/txt
1788−/* src-508 %jibb /tests/golden/types-union-import/source/jibb
1789−/* tok-508 %txt /tests/golden/types-union-import/tokens/txt
1790−/* tre-508 %txt /tests/golden/types-union-import/tree/txt
1791−/* mod-508-1 %jibb /tests/golden/types-union-import/modules/ui/lib/jibb
1792−/* typ-508 %txt /tests/golden/types-union-import/types/txt
1793−/* mtre-508 %txt /tests/golden/types-union-import/module-trees/txt
1794−/* src-509 %jibb /tests/golden/types-union-local-pending/source/jibb
1795−/* tok-509 %txt /tests/golden/types-union-local-pending/tokens/txt
1796−/* tre-509 %txt /tests/golden/types-union-local-pending/tree/txt
1797−/* typ-509 %txt /tests/golden/types-union-local-pending/types/txt
1798−/* src-510 %jibb /tests/golden/types-union-overlap/source/jibb
1799−/* tok-510 %txt /tests/golden/types-union-overlap/tokens/txt
1800−/* tre-510 %txt /tests/golden/types-union-overlap/tree/txt
1801−/* typ-510 %txt /tests/golden/types-union-overlap/types/txt
1802−/* src-511 %jibb /tests/golden/types-union-overlap-nested/source/jibb
1803−/* tok-511 %txt /tests/golden/types-union-overlap-nested/tokens/txt
1804−/* tre-511 %txt /tests/golden/types-union-overlap-nested/tree/txt
1805−/* typ-511 %txt /tests/golden/types-union-overlap-nested/types/txt
1806−/* src-512 %jibb /tests/golden/types-union-patterns/source/jibb
1807−/* tok-512 %txt /tests/golden/types-union-patterns/tokens/txt
1808−/* tre-512 %txt /tests/golden/types-union-patterns/tree/txt
1809−/* typ-512 %txt /tests/golden/types-union-patterns/types/txt
1810−/* src-513 %jibb /tests/golden/types-union-patterns-generic/source/jibb
1811−/* tok-513 %txt /tests/golden/types-union-patterns-generic/tokens/txt
1812−/* tre-513 %txt /tests/golden/types-union-patterns-generic/tree/txt
1813−/* typ-513 %txt /tests/golden/types-union-patterns-generic/types/txt
1814−/* src-514 %jibb /tests/golden/types-union-patterns-import/source/jibb
1815−/* tok-514 %txt /tests/golden/types-union-patterns-import/tokens/txt
1816−/* tre-514 %txt /tests/golden/types-union-patterns-import/tree/txt
1817−/* mod-514-1 %jibb /tests/golden/types-union-patterns-import/modules/ui/lib/jibb
1818−/* typ-514 %txt /tests/golden/types-union-patterns-import/types/txt
1819−/* mtre-514 %txt /tests/golden/types-union-patterns-import/module-trees/txt
1820−/* src-515 %jibb /tests/golden/types-union-phantom-generic/source/jibb
1821−/* tok-515 %txt /tests/golden/types-union-phantom-generic/tokens/txt
1822−/* tre-515 %txt /tests/golden/types-union-phantom-generic/tree/txt
1823−/* typ-515 %txt /tests/golden/types-union-phantom-generic/types/txt
1824−/* src-516 %jibb /tests/golden/types-union-print-cross-namespace/source/jibb
1825−/* tok-516 %txt /tests/golden/types-union-print-cross-namespace/tokens/txt
1826−/* tre-516 %txt /tests/golden/types-union-print-cross-namespace/tree/txt
1827−/* mod-516-1 %jibb /tests/golden/types-union-print-cross-namespace/modules/ui/lib/jibb
1828−/* typ-516 %txt /tests/golden/types-union-print-cross-namespace/types/txt
1829−/* mtre-516 %txt /tests/golden/types-union-print-cross-namespace/module-trees/txt
1830−/* src-517 %jibb /tests/golden/types-union-print-distinct/source/jibb
1831−/* tok-517 %txt /tests/golden/types-union-print-distinct/tokens/txt
1832−/* tre-517 %txt /tests/golden/types-union-print-distinct/tree/txt
1833−/* mod-517-1 %jibb /tests/golden/types-union-print-distinct/modules/ui/left/jibb
1834−/* mod-517-2 %jibb /tests/golden/types-union-print-distinct/modules/ui/right/jibb
1835−/* mod-517-3 %jibb /tests/golden/types-union-print-distinct/modules/ui/twin/jibb
1836−/* typ-517 %txt /tests/golden/types-union-print-distinct/types/txt
1837−/* mtre-517 %txt /tests/golden/types-union-print-distinct/module-trees/txt
1838−/* src-518 %jibb /tests/golden/types-union-print-escape/source/jibb
1839−/* tok-518 %txt /tests/golden/types-union-print-escape/tokens/txt
1840−/* tre-518 %txt /tests/golden/types-union-print-escape/tree/txt
1841−/* typ-518 %txt /tests/golden/types-union-print-escape/types/txt
1842−/* src-519 %jibb /tests/golden/types-union-print-local/source/jibb
1843−/* tok-519 %txt /tests/golden/types-union-print-local/tokens/txt
1844−/* tre-519 %txt /tests/golden/types-union-print-local/tree/txt
1845−/* typ-519 %txt /tests/golden/types-union-print-local/types/txt
1846−/* src-520 %jibb /tests/golden/types-union-print-nested/source/jibb
1847−/* tok-520 %txt /tests/golden/types-union-print-nested/tokens/txt
1848−/* tre-520 %txt /tests/golden/types-union-print-nested/tree/txt
1849−/* typ-520 %txt /tests/golden/types-union-print-nested/types/txt
1850−/* src-521 %jibb /tests/golden/types-union-print-same-origin/source/jibb
1851−/* tok-521 %txt /tests/golden/types-union-print-same-origin/tokens/txt
1852−/* tre-521 %txt /tests/golden/types-union-print-same-origin/tree/txt
1853−/* mod-521-1 %jibb /tests/golden/types-union-print-same-origin/modules/ui/shared/jibb
1854−/* typ-521 %txt /tests/golden/types-union-print-same-origin/types/txt
1855−/* mtre-521 %txt /tests/golden/types-union-print-same-origin/module-trees/txt
1856−/* src-522 %jibb /tests/golden/types-union-print-transitive/source/jibb
1857−/* tok-522 %txt /tests/golden/types-union-print-transitive/tokens/txt
1858−/* tre-522 %txt /tests/golden/types-union-print-transitive/tree/txt
1859−/* mod-522-1 %jibb /tests/golden/types-union-print-transitive/modules/ui/mid/jibb
1860−/* mod-522-2 %jibb /tests/golden/types-union-print-transitive/modules/ui/base/jibb
1861−/* typ-522 %txt /tests/golden/types-union-print-transitive/types/txt
1862−/* mtre-522 %txt /tests/golden/types-union-print-transitive/module-trees/txt
1863−/* src-523 %jibb /tests/golden/types-union-singleton/source/jibb
1864−/* tok-523 %txt /tests/golden/types-union-singleton/tokens/txt
1865−/* tre-523 %txt /tests/golden/types-union-singleton/tree/txt
1866−/* typ-523 %txt /tests/golden/types-union-singleton/types/txt
1867−/* src-524 %jibb /tests/golden/types-union-tag-atoms/source/jibb
1868−/* tok-524 %txt /tests/golden/types-union-tag-atoms/tokens/txt
1869−/* tre-524 %txt /tests/golden/types-union-tag-atoms/tree/txt
1870−/* typ-524 %txt /tests/golden/types-union-tag-atoms/types/txt
1871−/* src-525 %jibb /tests/golden/types-union-tags/source/jibb
1872−/* tok-525 %txt /tests/golden/types-union-tags/tokens/txt
1873−/* tre-525 %txt /tests/golden/types-union-tags/tree/txt
1874−/* typ-525 %txt /tests/golden/types-union-tags/types/txt
1875−/* src-526 %jibb /tests/golden/types-union-unresolved/source/jibb
1876−/* tok-526 %txt /tests/golden/types-union-unresolved/tokens/txt
1877−/* tre-526 %txt /tests/golden/types-union-unresolved/tree/txt
1878−/* typ-526 %txt /tests/golden/types-union-unresolved/types/txt
1879−/* src-527 %jibb /tests/golden/types-union-unresolved-flow/source/jibb
1880−/* tok-527 %txt /tests/golden/types-union-unresolved-flow/tokens/txt
1881−/* tre-527 %txt /tests/golden/types-union-unresolved-flow/tree/txt
1882−/* typ-527 %txt /tests/golden/types-union-unresolved-flow/types/txt
1883−/* src-528 %jibb /tests/golden/types-unit-context/source/jibb
1884−/* tok-528 %txt /tests/golden/types-unit-context/tokens/txt
1885−/* tre-528 %txt /tests/golden/types-unit-context/tree/txt
1886−/* typ-528 %txt /tests/golden/types-unit-context/types/txt
1887−/* src-529 %jibb /tests/golden/types-unit-patterns/source/jibb
1888−/* tok-529 %txt /tests/golden/types-unit-patterns/tokens/txt
1889−/* tre-529 %txt /tests/golden/types-unit-patterns/tree/txt
1890−/* typ-529 %txt /tests/golden/types-unit-patterns/types/txt
1687+/* src-484 %jibb /tests/golden/types-record-change/source/jibb
1688+/* tok-484 %txt /tests/golden/types-record-change/tokens/txt
1689+/* tre-484 %txt /tests/golden/types-record-change/tree/txt
1690+/* typ-484 %txt /tests/golden/types-record-change/types/txt
1691+/* src-485 %jibb /tests/golden/types-record-change-generic/source/jibb
1692+/* tok-485 %txt /tests/golden/types-record-change-generic/tokens/txt
1693+/* tre-485 %txt /tests/golden/types-record-change-generic/tree/txt
1694+/* typ-485 %txt /tests/golden/types-record-change-generic/types/txt
1695+/* src-486 %jibb /tests/golden/types-record-faces/source/jibb
1696+/* tok-486 %txt /tests/golden/types-record-faces/tokens/txt
1697+/* tre-486 %txt /tests/golden/types-record-faces/tree/txt
1698+/* typ-486 %txt /tests/golden/types-record-faces/types/txt
1699+/* src-487 %jibb /tests/golden/types-record-import/source/jibb
1700+/* tok-487 %txt /tests/golden/types-record-import/tokens/txt
1701+/* tre-487 %txt /tests/golden/types-record-import/tree/txt
1702+/* mod-487-1 %jibb /tests/golden/types-record-import/modules/ui/lib/jibb
1703+/* typ-487 %txt /tests/golden/types-record-import/types/txt
1704+/* mtre-487 %txt /tests/golden/types-record-import/module-trees/txt
1705+/* src-488 %jibb /tests/golden/types-record-local-scheme/source/jibb
1706+/* tok-488 %txt /tests/golden/types-record-local-scheme/tokens/txt
1707+/* tre-488 %txt /tests/golden/types-record-local-scheme/tree/txt
1708+/* typ-488 %txt /tests/golden/types-record-local-scheme/types/txt
1709+/* src-489 %jibb /tests/golden/types-record-nested/source/jibb
1710+/* tok-489 %txt /tests/golden/types-record-nested/tokens/txt
1711+/* tre-489 %txt /tests/golden/types-record-nested/tree/txt
1712+/* typ-489 %txt /tests/golden/types-record-nested/types/txt
1713+/* src-490 %jibb /tests/golden/types-record-to-tuple/source/jibb
1714+/* tok-490 %txt /tests/golden/types-record-to-tuple/tokens/txt
1715+/* tre-490 %txt /tests/golden/types-record-to-tuple/tree/txt
1716+/* typ-490 %txt /tests/golden/types-record-to-tuple/types/txt
1717+/* src-491 %jibb /tests/golden/types-recursion-scc-failures/source/jibb
1718+/* tok-491 %txt /tests/golden/types-recursion-scc-failures/tokens/txt
1719+/* tre-491 %txt /tests/golden/types-recursion-scc-failures/tree/txt
1720+/* typ-491 %txt /tests/golden/types-recursion-scc-failures/types/txt
1721+/* src-492 %jibb /tests/golden/types-recursion-scc-groups/source/jibb
1722+/* tok-492 %txt /tests/golden/types-recursion-scc-groups/tokens/txt
1723+/* tre-492 %txt /tests/golden/types-recursion-scc-groups/tree/txt
1724+/* typ-492 %txt /tests/golden/types-recursion-scc-groups/types/txt
1725+/* src-493 %jibb /tests/golden/types-recursion-scc-import/source/jibb
1726+/* tok-493 %txt /tests/golden/types-recursion-scc-import/tokens/txt
1727+/* tre-493 %txt /tests/golden/types-recursion-scc-import/tree/txt
1728+/* mod-493-1 %jibb /tests/golden/types-recursion-scc-import/modules/ui/lib/jibb
1729+/* typ-493 %txt /tests/golden/types-recursion-scc-import/types/txt
1730+/* mtre-493 %txt /tests/golden/types-recursion-scc-import/module-trees/txt
1731+/* src-494 %jibb /tests/golden/types-recursion-scc-import-bad/source/jibb
1732+/* tok-494 %txt /tests/golden/types-recursion-scc-import-bad/tokens/txt
1733+/* tre-494 %txt /tests/golden/types-recursion-scc-import-bad/tree/txt
1734+/* mod-494-1 %jibb /tests/golden/types-recursion-scc-import-bad/modules/ui/lib/jibb
1735+/* typ-494 %txt /tests/golden/types-recursion-scc-import-bad/types/txt
1736+/* mtre-494 %txt /tests/golden/types-recursion-scc-import-bad/module-trees/txt
1737+/* src-495 %jibb /tests/golden/types-recursion-scc-local/source/jibb
1738+/* tok-495 %txt /tests/golden/types-recursion-scc-local/tokens/txt
1739+/* tre-495 %txt /tests/golden/types-recursion-scc-local/tree/txt
1740+/* typ-495 %txt /tests/golden/types-recursion-scc-local/types/txt
1741+/* src-496 %jibb /tests/golden/types-recursion-scc-order/source/jibb
1742+/* tok-496 %txt /tests/golden/types-recursion-scc-order/tokens/txt
1743+/* tre-496 %txt /tests/golden/types-recursion-scc-order/tree/txt
1744+/* typ-496 %txt /tests/golden/types-recursion-scc-order/types/txt
1745+/* src-497 %jibb /tests/golden/types-recursion-scc-shadow/source/jibb
1746+/* tok-497 %txt /tests/golden/types-recursion-scc-shadow/tokens/txt
1747+/* tre-497 %txt /tests/golden/types-recursion-scc-shadow/tree/txt
1748+/* typ-497 %txt /tests/golden/types-recursion-scc-shadow/types/txt
1749+/* src-498 %jibb /tests/golden/types-recursive-branch/source/jibb
1750+/* tok-498 %txt /tests/golden/types-recursive-branch/tokens/txt
1751+/* tre-498 %txt /tests/golden/types-recursive-branch/tree/txt
1752+/* typ-498 %txt /tests/golden/types-recursive-branch/types/txt
1753+/* src-499 %jibb /tests/golden/types-recursive-gate/source/jibb
1754+/* tok-499 %txt /tests/golden/types-recursive-gate/tokens/txt
1755+/* tre-499 %txt /tests/golden/types-recursive-gate/tree/txt
1756+/* typ-499 %txt /tests/golden/types-recursive-gate/types/txt
1757+/* src-500 %jibb /tests/golden/types-recursive-sample/source/jibb
1758+/* tok-500 %txt /tests/golden/types-recursive-sample/tokens/txt
1759+/* tre-500 %txt /tests/golden/types-recursive-sample/tree/txt
1760+/* typ-500 %txt /tests/golden/types-recursive-sample/types/txt
1761+/* src-501 %jibb /tests/golden/types-string-interpolation/source/jibb
1762+/* tok-501 %txt /tests/golden/types-string-interpolation/tokens/txt
1763+/* tre-501 %txt /tests/golden/types-string-interpolation/tree/txt
1764+/* typ-501 %txt /tests/golden/types-string-interpolation/types/txt
1765+/* src-502 %jibb /tests/golden/types-tuple-context/source/jibb
1766+/* tok-502 %txt /tests/golden/types-tuple-context/tokens/txt
1767+/* tre-502 %txt /tests/golden/types-tuple-context/tree/txt
1768+/* typ-502 %txt /tests/golden/types-tuple-context/types/txt
1769+/* src-503 %jibb /tests/golden/types-tuple-context-nested/source/jibb
1770+/* tok-503 %txt /tests/golden/types-tuple-context-nested/tokens/txt
1771+/* tre-503 %txt /tests/golden/types-tuple-context-nested/tree/txt
1772+/* typ-503 %txt /tests/golden/types-tuple-context-nested/types/txt
1773+/* src-504 %jibb /tests/golden/types-union-alias/source/jibb
1774+/* tok-504 %txt /tests/golden/types-union-alias/tokens/txt
1775+/* tre-504 %txt /tests/golden/types-union-alias/tree/txt
1776+/* typ-504 %txt /tests/golden/types-union-alias/types/txt
1777+/* src-505 %jibb /tests/golden/types-union-branch-context/source/jibb
1778+/* tok-505 %txt /tests/golden/types-union-branch-context/tokens/txt
1779+/* tre-505 %txt /tests/golden/types-union-branch-context/tree/txt
1780+/* typ-505 %txt /tests/golden/types-union-branch-context/types/txt
1781+/* src-506 %jibb /tests/golden/types-union-branch-pending/source/jibb
1782+/* tok-506 %txt /tests/golden/types-union-branch-pending/tokens/txt
1783+/* tre-506 %txt /tests/golden/types-union-branch-pending/tree/txt
1784+/* typ-506 %txt /tests/golden/types-union-branch-pending/types/txt
1785+/* src-507 %jibb /tests/golden/types-union-constructor-shape/source/jibb
1786+/* tok-507 %txt /tests/golden/types-union-constructor-shape/tokens/txt
1787+/* tre-507 %txt /tests/golden/types-union-constructor-shape/tree/txt
1788+/* typ-507 %txt /tests/golden/types-union-constructor-shape/types/txt
1789+/* src-508 %jibb /tests/golden/types-union-context-flow/source/jibb
1790+/* tok-508 %txt /tests/golden/types-union-context-flow/tokens/txt
1791+/* tre-508 %txt /tests/golden/types-union-context-flow/tree/txt
1792+/* typ-508 %txt /tests/golden/types-union-context-flow/types/txt
1793+/* src-509 %jibb /tests/golden/types-union-finite/source/jibb
1794+/* tok-509 %txt /tests/golden/types-union-finite/tokens/txt
1795+/* tre-509 %txt /tests/golden/types-union-finite/tree/txt
1796+/* typ-509 %txt /tests/golden/types-union-finite/types/txt
1797+/* src-510 %jibb /tests/golden/types-union-finite-generic/source/jibb
1798+/* tok-510 %txt /tests/golden/types-union-finite-generic/tokens/txt
1799+/* tre-510 %txt /tests/golden/types-union-finite-generic/tree/txt
1800+/* typ-510 %txt /tests/golden/types-union-finite-generic/types/txt
1801+/* src-511 %jibb /tests/golden/types-union-finite-limit/source/jibb
1802+/* tok-511 %txt /tests/golden/types-union-finite-limit/tokens/txt
1803+/* tre-511 %txt /tests/golden/types-union-finite-limit/tree/txt
1804+/* typ-511 %txt /tests/golden/types-union-finite-limit/types/txt
1805+/* src-512 %jibb /tests/golden/types-union-import/source/jibb
1806+/* tok-512 %txt /tests/golden/types-union-import/tokens/txt
1807+/* tre-512 %txt /tests/golden/types-union-import/tree/txt
1808+/* mod-512-1 %jibb /tests/golden/types-union-import/modules/ui/lib/jibb
1809+/* typ-512 %txt /tests/golden/types-union-import/types/txt
1810+/* mtre-512 %txt /tests/golden/types-union-import/module-trees/txt
1811+/* src-513 %jibb /tests/golden/types-union-local-pending/source/jibb
1812+/* tok-513 %txt /tests/golden/types-union-local-pending/tokens/txt
1813+/* tre-513 %txt /tests/golden/types-union-local-pending/tree/txt
1814+/* typ-513 %txt /tests/golden/types-union-local-pending/types/txt
1815+/* src-514 %jibb /tests/golden/types-union-overlap/source/jibb
1816+/* tok-514 %txt /tests/golden/types-union-overlap/tokens/txt
1817+/* tre-514 %txt /tests/golden/types-union-overlap/tree/txt
1818+/* typ-514 %txt /tests/golden/types-union-overlap/types/txt
1819+/* src-515 %jibb /tests/golden/types-union-overlap-nested/source/jibb
1820+/* tok-515 %txt /tests/golden/types-union-overlap-nested/tokens/txt
1821+/* tre-515 %txt /tests/golden/types-union-overlap-nested/tree/txt
1822+/* typ-515 %txt /tests/golden/types-union-overlap-nested/types/txt
1823+/* src-516 %jibb /tests/golden/types-union-patterns/source/jibb
1824+/* tok-516 %txt /tests/golden/types-union-patterns/tokens/txt
1825+/* tre-516 %txt /tests/golden/types-union-patterns/tree/txt
1826+/* typ-516 %txt /tests/golden/types-union-patterns/types/txt
1827+/* src-517 %jibb /tests/golden/types-union-patterns-generic/source/jibb
1828+/* tok-517 %txt /tests/golden/types-union-patterns-generic/tokens/txt
1829+/* tre-517 %txt /tests/golden/types-union-patterns-generic/tree/txt
1830+/* typ-517 %txt /tests/golden/types-union-patterns-generic/types/txt
1831+/* src-518 %jibb /tests/golden/types-union-patterns-import/source/jibb
1832+/* tok-518 %txt /tests/golden/types-union-patterns-import/tokens/txt
1833+/* tre-518 %txt /tests/golden/types-union-patterns-import/tree/txt
1834+/* mod-518-1 %jibb /tests/golden/types-union-patterns-import/modules/ui/lib/jibb
1835+/* typ-518 %txt /tests/golden/types-union-patterns-import/types/txt
1836+/* mtre-518 %txt /tests/golden/types-union-patterns-import/module-trees/txt
1837+/* src-519 %jibb /tests/golden/types-union-phantom-generic/source/jibb
1838+/* tok-519 %txt /tests/golden/types-union-phantom-generic/tokens/txt
1839+/* tre-519 %txt /tests/golden/types-union-phantom-generic/tree/txt
1840+/* typ-519 %txt /tests/golden/types-union-phantom-generic/types/txt
1841+/* src-520 %jibb /tests/golden/types-union-print-cross-namespace/source/jibb
1842+/* tok-520 %txt /tests/golden/types-union-print-cross-namespace/tokens/txt
1843+/* tre-520 %txt /tests/golden/types-union-print-cross-namespace/tree/txt
1844+/* mod-520-1 %jibb /tests/golden/types-union-print-cross-namespace/modules/ui/lib/jibb
1845+/* typ-520 %txt /tests/golden/types-union-print-cross-namespace/types/txt
1846+/* mtre-520 %txt /tests/golden/types-union-print-cross-namespace/module-trees/txt
1847+/* src-521 %jibb /tests/golden/types-union-print-distinct/source/jibb
1848+/* tok-521 %txt /tests/golden/types-union-print-distinct/tokens/txt
1849+/* tre-521 %txt /tests/golden/types-union-print-distinct/tree/txt
1850+/* mod-521-1 %jibb /tests/golden/types-union-print-distinct/modules/ui/left/jibb
1851+/* mod-521-2 %jibb /tests/golden/types-union-print-distinct/modules/ui/right/jibb
1852+/* mod-521-3 %jibb /tests/golden/types-union-print-distinct/modules/ui/twin/jibb
1853+/* typ-521 %txt /tests/golden/types-union-print-distinct/types/txt
1854+/* mtre-521 %txt /tests/golden/types-union-print-distinct/module-trees/txt
1855+/* src-522 %jibb /tests/golden/types-union-print-escape/source/jibb
1856+/* tok-522 %txt /tests/golden/types-union-print-escape/tokens/txt
1857+/* tre-522 %txt /tests/golden/types-union-print-escape/tree/txt
1858+/* typ-522 %txt /tests/golden/types-union-print-escape/types/txt
1859+/* src-523 %jibb /tests/golden/types-union-print-local/source/jibb
1860+/* tok-523 %txt /tests/golden/types-union-print-local/tokens/txt
1861+/* tre-523 %txt /tests/golden/types-union-print-local/tree/txt
1862+/* typ-523 %txt /tests/golden/types-union-print-local/types/txt
1863+/* src-524 %jibb /tests/golden/types-union-print-nested/source/jibb
1864+/* tok-524 %txt /tests/golden/types-union-print-nested/tokens/txt
1865+/* tre-524 %txt /tests/golden/types-union-print-nested/tree/txt
1866+/* typ-524 %txt /tests/golden/types-union-print-nested/types/txt
1867+/* src-525 %jibb /tests/golden/types-union-print-same-origin/source/jibb
1868+/* tok-525 %txt /tests/golden/types-union-print-same-origin/tokens/txt
1869+/* tre-525 %txt /tests/golden/types-union-print-same-origin/tree/txt
1870+/* mod-525-1 %jibb /tests/golden/types-union-print-same-origin/modules/ui/shared/jibb
1871+/* typ-525 %txt /tests/golden/types-union-print-same-origin/types/txt
1872+/* mtre-525 %txt /tests/golden/types-union-print-same-origin/module-trees/txt
1873+/* src-526 %jibb /tests/golden/types-union-print-transitive/source/jibb
1874+/* tok-526 %txt /tests/golden/types-union-print-transitive/tokens/txt
1875+/* tre-526 %txt /tests/golden/types-union-print-transitive/tree/txt
1876+/* mod-526-1 %jibb /tests/golden/types-union-print-transitive/modules/ui/mid/jibb
1877+/* mod-526-2 %jibb /tests/golden/types-union-print-transitive/modules/ui/base/jibb
1878+/* typ-526 %txt /tests/golden/types-union-print-transitive/types/txt
1879+/* mtre-526 %txt /tests/golden/types-union-print-transitive/module-trees/txt
1880+/* src-527 %jibb /tests/golden/types-union-singleton/source/jibb
1881+/* tok-527 %txt /tests/golden/types-union-singleton/tokens/txt
1882+/* tre-527 %txt /tests/golden/types-union-singleton/tree/txt
1883+/* typ-527 %txt /tests/golden/types-union-singleton/types/txt
1884+/* src-528 %jibb /tests/golden/types-union-tag-atoms/source/jibb
1885+/* tok-528 %txt /tests/golden/types-union-tag-atoms/tokens/txt
1886+/* tre-528 %txt /tests/golden/types-union-tag-atoms/tree/txt
1887+/* typ-528 %txt /tests/golden/types-union-tag-atoms/types/txt
1888+/* src-529 %jibb /tests/golden/types-union-tags/source/jibb
1889+/* tok-529 %txt /tests/golden/types-union-tags/tokens/txt
1890+/* tre-529 %txt /tests/golden/types-union-tags/tree/txt
1891+/* typ-529 %txt /tests/golden/types-union-tags/types/txt
1892+/* src-530 %jibb /tests/golden/types-union-unresolved/source/jibb
1893+/* tok-530 %txt /tests/golden/types-union-unresolved/tokens/txt
1894+/* tre-530 %txt /tests/golden/types-union-unresolved/tree/txt
1895+/* typ-530 %txt /tests/golden/types-union-unresolved/types/txt
1896+/* src-531 %jibb /tests/golden/types-union-unresolved-flow/source/jibb
1897+/* tok-531 %txt /tests/golden/types-union-unresolved-flow/tokens/txt
1898+/* tre-531 %txt /tests/golden/types-union-unresolved-flow/tree/txt
1899+/* typ-531 %txt /tests/golden/types-union-unresolved-flow/types/txt
1900+/* src-532 %jibb /tests/golden/types-unit-context/source/jibb
1901+/* tok-532 %txt /tests/golden/types-unit-context/tokens/txt
1902+/* tre-532 %txt /tests/golden/types-unit-context/tree/txt
1903+/* typ-532 %txt /tests/golden/types-unit-context/types/txt
1904+/* src-533 %jibb /tests/golden/types-unit-patterns/source/jibb
1905+/* tok-533 %txt /tests/golden/types-unit-patterns/tokens/txt
1906+/* tre-533 %txt /tests/golden/types-unit-patterns/tree/txt
1907+/* typ-533 %txt /tests/golden/types-unit-patterns/types/txt
18911908=/ prepared-prelude (prepare-prelude:jibb prelude-source)
18921909|%
18931910:: one arm per case
@@ -1903,7 +1920,7 @@
19031920++ test-doc-grammar-04-step
19041921 (weld (check ~.doc-grammar-04-step src-5 `tok-5 `tre-5) (check-module-types ~.doc-grammar-04-step ~[%tests %golden ~.doc-grammar-04-step %source %jibb] src-5 `typ-5 ~ ~ ~))
19051922++ test-doc-grammar-06-cart-store
1906− (check ~.doc-grammar-06-cart-store src-6 `tok-6 `tre-6)
1923+ (weld (check ~.doc-grammar-06-cart-store src-6 `tok-6 `tre-6) (check-module-types ~.doc-grammar-06-cart-store ~[%tests %golden ~.doc-grammar-06-cart-store %source %jibb] src-6 `typ-6 ~ ~ ~))
19071924++ test-doc-grammar-07-basket
19081925 (check ~.doc-grammar-07-basket src-7 `tok-7 `tre-7)
19091926++ test-doc-overview-01-cmd-sub
@@ -2858,98 +2875,106 @@
28582875 (weld (weld (check ~.types-prelude-list-functions src-482 `tok-482 `tre-482) (check-module-types ~.types-prelude-list-functions ~[%tests %golden ~.types-prelude-list-functions %source %jibb] src-482 `typ-482 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-482-1]])) (check-module-trees ~.types-prelude-list-functions `mtre-482 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-482-1]]))
28592876++ test-types-record-bound-variable
28602877 (weld (check ~.types-record-bound-variable src-483 `tok-483 `tre-483) (check-types ~.types-record-bound-variable ~[%tests %golden ~.types-record-bound-variable %source %jibb] src-483 `typ-483))
2878+++ test-types-record-change
2879+ (weld (check ~.types-record-change src-484 `tok-484 `tre-484) (check-module-types ~.types-record-change ~[%tests %golden ~.types-record-change %source %jibb] src-484 `typ-484 ~ ~ ~))
2880+++ test-types-record-change-generic
2881+ (weld (check ~.types-record-change-generic src-485 `tok-485 `tre-485) (check-module-types ~.types-record-change-generic ~[%tests %golden ~.types-record-change-generic %source %jibb] src-485 `typ-485 ~ ~ ~))
28612882++ test-types-record-faces
2862− (weld (check ~.types-record-faces src-484 `tok-484 `tre-484) (check-types ~.types-record-faces ~[%tests %golden ~.types-record-faces %source %jibb] src-484 `typ-484))
2883+ (weld (check ~.types-record-faces src-486 `tok-486 `tre-486) (check-types ~.types-record-faces ~[%tests %golden ~.types-record-faces %source %jibb] src-486 `typ-486))
28632884++ test-types-record-import
2864− (weld (weld (check ~.types-record-import src-485 `tok-485 `tre-485) (check-module-types ~.types-record-import ~[%tests %golden ~.types-record-import %source %jibb] src-485 `typ-485 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-485-1]])) (check-module-trees ~.types-record-import `mtre-485 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-485-1]]))
2885+ (weld (weld (check ~.types-record-import src-487 `tok-487 `tre-487) (check-module-types ~.types-record-import ~[%tests %golden ~.types-record-import %source %jibb] src-487 `typ-487 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-487-1]])) (check-module-trees ~.types-record-import `mtre-487 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-487-1]]))
28652886++ test-types-record-local-scheme
2866− (weld (check ~.types-record-local-scheme src-486 `tok-486 `tre-486) (check-types ~.types-record-local-scheme ~[%tests %golden ~.types-record-local-scheme %source %jibb] src-486 `typ-486))
2887+ (weld (check ~.types-record-local-scheme src-488 `tok-488 `tre-488) (check-types ~.types-record-local-scheme ~[%tests %golden ~.types-record-local-scheme %source %jibb] src-488 `typ-488))
28672888++ test-types-record-nested
2868− (weld (check ~.types-record-nested src-487 `tok-487 `tre-487) (check-types ~.types-record-nested ~[%tests %golden ~.types-record-nested %source %jibb] src-487 `typ-487))
2889+ (weld (check ~.types-record-nested src-489 `tok-489 `tre-489) (check-types ~.types-record-nested ~[%tests %golden ~.types-record-nested %source %jibb] src-489 `typ-489))
28692890++ test-types-record-to-tuple
2870− (weld (check ~.types-record-to-tuple src-488 `tok-488 `tre-488) (check-types ~.types-record-to-tuple ~[%tests %golden ~.types-record-to-tuple %source %jibb] src-488 `typ-488))
2891+ (weld (check ~.types-record-to-tuple src-490 `tok-490 `tre-490) (check-types ~.types-record-to-tuple ~[%tests %golden ~.types-record-to-tuple %source %jibb] src-490 `typ-490))
28712892++ test-types-recursion-scc-failures
2872− (weld (check ~.types-recursion-scc-failures src-489 `tok-489 `tre-489) (check-module-types ~.types-recursion-scc-failures ~[%tests %golden ~.types-recursion-scc-failures %source %jibb] src-489 `typ-489 ~ ~ ~))
2893+ (weld (check ~.types-recursion-scc-failures src-491 `tok-491 `tre-491) (check-module-types ~.types-recursion-scc-failures ~[%tests %golden ~.types-recursion-scc-failures %source %jibb] src-491 `typ-491 ~ ~ ~))
28732894++ test-types-recursion-scc-groups
2874− (weld (check ~.types-recursion-scc-groups src-490 `tok-490 `tre-490) (check-module-types ~.types-recursion-scc-groups ~[%tests %golden ~.types-recursion-scc-groups %source %jibb] src-490 `typ-490 ~ ~ ~))
2895+ (weld (check ~.types-recursion-scc-groups src-492 `tok-492 `tre-492) (check-module-types ~.types-recursion-scc-groups ~[%tests %golden ~.types-recursion-scc-groups %source %jibb] src-492 `typ-492 ~ ~ ~))
28752896++ test-types-recursion-scc-import
2876− (weld (weld (check ~.types-recursion-scc-import src-491 `tok-491 `tre-491) (check-module-types ~.types-recursion-scc-import ~[%tests %golden ~.types-recursion-scc-import %source %jibb] src-491 `typ-491 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-491-1]])) (check-module-trees ~.types-recursion-scc-import `mtre-491 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-491-1]]))
2897+ (weld (weld (check ~.types-recursion-scc-import src-493 `tok-493 `tre-493) (check-module-types ~.types-recursion-scc-import ~[%tests %golden ~.types-recursion-scc-import %source %jibb] src-493 `typ-493 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-493-1]])) (check-module-trees ~.types-recursion-scc-import `mtre-493 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-493-1]]))
28772898++ test-types-recursion-scc-import-bad
2878− (weld (weld (check ~.types-recursion-scc-import-bad src-492 `tok-492 `tre-492) (check-module-types ~.types-recursion-scc-import-bad ~[%tests %golden ~.types-recursion-scc-import-bad %source %jibb] src-492 `typ-492 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-492-1]])) (check-module-trees ~.types-recursion-scc-import-bad `mtre-492 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-492-1]]))
2899+ (weld (weld (check ~.types-recursion-scc-import-bad src-494 `tok-494 `tre-494) (check-module-types ~.types-recursion-scc-import-bad ~[%tests %golden ~.types-recursion-scc-import-bad %source %jibb] src-494 `typ-494 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-494-1]])) (check-module-trees ~.types-recursion-scc-import-bad `mtre-494 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-494-1]]))
28792900++ test-types-recursion-scc-local
2880− (weld (check ~.types-recursion-scc-local src-493 `tok-493 `tre-493) (check-module-types ~.types-recursion-scc-local ~[%tests %golden ~.types-recursion-scc-local %source %jibb] src-493 `typ-493 ~ ~ ~))
2901+ (weld (check ~.types-recursion-scc-local src-495 `tok-495 `tre-495) (check-module-types ~.types-recursion-scc-local ~[%tests %golden ~.types-recursion-scc-local %source %jibb] src-495 `typ-495 ~ ~ ~))
28812902++ test-types-recursion-scc-order
2882− (weld (check ~.types-recursion-scc-order src-494 `tok-494 `tre-494) (check-module-types ~.types-recursion-scc-order ~[%tests %golden ~.types-recursion-scc-order %source %jibb] src-494 `typ-494 ~ ~ ~))
2903+ (weld (check ~.types-recursion-scc-order src-496 `tok-496 `tre-496) (check-module-types ~.types-recursion-scc-order ~[%tests %golden ~.types-recursion-scc-order %source %jibb] src-496 `typ-496 ~ ~ ~))
28832904++ test-types-recursion-scc-shadow
2884− (weld (check ~.types-recursion-scc-shadow src-495 `tok-495 `tre-495) (check-module-types ~.types-recursion-scc-shadow ~[%tests %golden ~.types-recursion-scc-shadow %source %jibb] src-495 `typ-495 ~ ~ ~))
2905+ (weld (check ~.types-recursion-scc-shadow src-497 `tok-497 `tre-497) (check-module-types ~.types-recursion-scc-shadow ~[%tests %golden ~.types-recursion-scc-shadow %source %jibb] src-497 `typ-497 ~ ~ ~))
28852906++ test-types-recursive-branch
2886− (weld (check ~.types-recursive-branch src-496 `tok-496 `tre-496) (check-module-types ~.types-recursive-branch ~[%tests %golden ~.types-recursive-branch %source %jibb] src-496 `typ-496 ~ ~ ~))
2907+ (weld (check ~.types-recursive-branch src-498 `tok-498 `tre-498) (check-module-types ~.types-recursive-branch ~[%tests %golden ~.types-recursive-branch %source %jibb] src-498 `typ-498 ~ ~ ~))
28872908++ test-types-recursive-gate
2888− (weld (check ~.types-recursive-gate src-497 `tok-497 `tre-497) (check-types ~.types-recursive-gate ~[%tests %golden ~.types-recursive-gate %source %jibb] src-497 `typ-497))
2909+ (weld (check ~.types-recursive-gate src-499 `tok-499 `tre-499) (check-types ~.types-recursive-gate ~[%tests %golden ~.types-recursive-gate %source %jibb] src-499 `typ-499))
28892910++ test-types-recursive-sample
2890− (weld (check ~.types-recursive-sample src-498 `tok-498 `tre-498) (check-types ~.types-recursive-sample ~[%tests %golden ~.types-recursive-sample %source %jibb] src-498 `typ-498))
2911+ (weld (check ~.types-recursive-sample src-500 `tok-500 `tre-500) (check-types ~.types-recursive-sample ~[%tests %golden ~.types-recursive-sample %source %jibb] src-500 `typ-500))
28912912++ test-types-string-interpolation
2892− (weld (check ~.types-string-interpolation src-499 `tok-499 `tre-499) (check-module-types ~.types-string-interpolation ~[%tests %golden ~.types-string-interpolation %source %jibb] src-499 `typ-499 ~ ~ ~))
2913+ (weld (check ~.types-string-interpolation src-501 `tok-501 `tre-501) (check-module-types ~.types-string-interpolation ~[%tests %golden ~.types-string-interpolation %source %jibb] src-501 `typ-501 ~ ~ ~))
2914+++ test-types-tuple-context
2915+ (weld (check ~.types-tuple-context src-502 `tok-502 `tre-502) (check-module-types ~.types-tuple-context ~[%tests %golden ~.types-tuple-context %source %jibb] src-502 `typ-502 ~ ~ ~))
2916+++ test-types-tuple-context-nested
2917+ (weld (check ~.types-tuple-context-nested src-503 `tok-503 `tre-503) (check-module-types ~.types-tuple-context-nested ~[%tests %golden ~.types-tuple-context-nested %source %jibb] src-503 `typ-503 ~ ~ ~))
28932918++ test-types-union-alias
2894− (weld (check ~.types-union-alias src-500 `tok-500 `tre-500) (check-types ~.types-union-alias ~[%tests %golden ~.types-union-alias %source %jibb] src-500 `typ-500))
2919+ (weld (check ~.types-union-alias src-504 `tok-504 `tre-504) (check-types ~.types-union-alias ~[%tests %golden ~.types-union-alias %source %jibb] src-504 `typ-504))
28952920++ test-types-union-branch-context
2896− (weld (check ~.types-union-branch-context src-501 `tok-501 `tre-501) (check-types ~.types-union-branch-context ~[%tests %golden ~.types-union-branch-context %source %jibb] src-501 `typ-501))
2921+ (weld (check ~.types-union-branch-context src-505 `tok-505 `tre-505) (check-types ~.types-union-branch-context ~[%tests %golden ~.types-union-branch-context %source %jibb] src-505 `typ-505))
28972922++ test-types-union-branch-pending
2898− (weld (check ~.types-union-branch-pending src-502 `tok-502 `tre-502) (check-types ~.types-union-branch-pending ~[%tests %golden ~.types-union-branch-pending %source %jibb] src-502 `typ-502))
2923+ (weld (check ~.types-union-branch-pending src-506 `tok-506 `tre-506) (check-types ~.types-union-branch-pending ~[%tests %golden ~.types-union-branch-pending %source %jibb] src-506 `typ-506))
28992924++ test-types-union-constructor-shape
2900− (weld (check ~.types-union-constructor-shape src-503 `tok-503 `tre-503) (check-types ~.types-union-constructor-shape ~[%tests %golden ~.types-union-constructor-shape %source %jibb] src-503 `typ-503))
2925+ (weld (check ~.types-union-constructor-shape src-507 `tok-507 `tre-507) (check-types ~.types-union-constructor-shape ~[%tests %golden ~.types-union-constructor-shape %source %jibb] src-507 `typ-507))
29012926++ test-types-union-context-flow
2902− (weld (check ~.types-union-context-flow src-504 `tok-504 `tre-504) (check-types ~.types-union-context-flow ~[%tests %golden ~.types-union-context-flow %source %jibb] src-504 `typ-504))
2927+ (weld (check ~.types-union-context-flow src-508 `tok-508 `tre-508) (check-types ~.types-union-context-flow ~[%tests %golden ~.types-union-context-flow %source %jibb] src-508 `typ-508))
29032928++ test-types-union-finite
2904− (weld (check ~.types-union-finite src-505 `tok-505 `tre-505) (check-module-types ~.types-union-finite ~[%tests %golden ~.types-union-finite %source %jibb] src-505 `typ-505 ~ ~ ~))
2929+ (weld (check ~.types-union-finite src-509 `tok-509 `tre-509) (check-module-types ~.types-union-finite ~[%tests %golden ~.types-union-finite %source %jibb] src-509 `typ-509 ~ ~ ~))
29052930++ test-types-union-finite-generic
2906− (weld (check ~.types-union-finite-generic src-506 `tok-506 `tre-506) (check-module-types ~.types-union-finite-generic ~[%tests %golden ~.types-union-finite-generic %source %jibb] src-506 `typ-506 ~ ~ ~))
2931+ (weld (check ~.types-union-finite-generic src-510 `tok-510 `tre-510) (check-module-types ~.types-union-finite-generic ~[%tests %golden ~.types-union-finite-generic %source %jibb] src-510 `typ-510 ~ ~ ~))
29072932++ test-types-union-finite-limit
2908− (weld (check ~.types-union-finite-limit src-507 `tok-507 `tre-507) (check-module-types ~.types-union-finite-limit ~[%tests %golden ~.types-union-finite-limit %source %jibb] src-507 `typ-507 ~ ~ ~))
2933+ (weld (check ~.types-union-finite-limit src-511 `tok-511 `tre-511) (check-module-types ~.types-union-finite-limit ~[%tests %golden ~.types-union-finite-limit %source %jibb] src-511 `typ-511 ~ ~ ~))
29092934++ test-types-union-import
2910− (weld (weld (check ~.types-union-import src-508 `tok-508 `tre-508) (check-module-types ~.types-union-import ~[%tests %golden ~.types-union-import %source %jibb] src-508 `typ-508 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-508-1]])) (check-module-trees ~.types-union-import `mtre-508 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-508-1]]))
2935+ (weld (weld (check ~.types-union-import src-512 `tok-512 `tre-512) (check-module-types ~.types-union-import ~[%tests %golden ~.types-union-import %source %jibb] src-512 `typ-512 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-512-1]])) (check-module-trees ~.types-union-import `mtre-512 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-512-1]]))
29112936++ test-types-union-local-pending
2912− (weld (check ~.types-union-local-pending src-509 `tok-509 `tre-509) (check-types ~.types-union-local-pending ~[%tests %golden ~.types-union-local-pending %source %jibb] src-509 `typ-509))
2937+ (weld (check ~.types-union-local-pending src-513 `tok-513 `tre-513) (check-types ~.types-union-local-pending ~[%tests %golden ~.types-union-local-pending %source %jibb] src-513 `typ-513))
29132938++ test-types-union-overlap
2914− (weld (check ~.types-union-overlap src-510 `tok-510 `tre-510) (check-types ~.types-union-overlap ~[%tests %golden ~.types-union-overlap %source %jibb] src-510 `typ-510))
2939+ (weld (check ~.types-union-overlap src-514 `tok-514 `tre-514) (check-types ~.types-union-overlap ~[%tests %golden ~.types-union-overlap %source %jibb] src-514 `typ-514))
29152940++ test-types-union-overlap-nested
2916− (weld (check ~.types-union-overlap-nested src-511 `tok-511 `tre-511) (check-types ~.types-union-overlap-nested ~[%tests %golden ~.types-union-overlap-nested %source %jibb] src-511 `typ-511))
2941+ (weld (check ~.types-union-overlap-nested src-515 `tok-515 `tre-515) (check-types ~.types-union-overlap-nested ~[%tests %golden ~.types-union-overlap-nested %source %jibb] src-515 `typ-515))
29172942++ test-types-union-patterns
2918− (weld (check ~.types-union-patterns src-512 `tok-512 `tre-512) (check-module-types ~.types-union-patterns ~[%tests %golden ~.types-union-patterns %source %jibb] src-512 `typ-512 ~ ~ ~))
2943+ (weld (check ~.types-union-patterns src-516 `tok-516 `tre-516) (check-module-types ~.types-union-patterns ~[%tests %golden ~.types-union-patterns %source %jibb] src-516 `typ-516 ~ ~ ~))
29192944++ test-types-union-patterns-generic
2920− (weld (check ~.types-union-patterns-generic src-513 `tok-513 `tre-513) (check-module-types ~.types-union-patterns-generic ~[%tests %golden ~.types-union-patterns-generic %source %jibb] src-513 `typ-513 ~ ~ ~))
2945+ (weld (check ~.types-union-patterns-generic src-517 `tok-517 `tre-517) (check-module-types ~.types-union-patterns-generic ~[%tests %golden ~.types-union-patterns-generic %source %jibb] src-517 `typ-517 ~ ~ ~))
29212946++ test-types-union-patterns-import
2922− (weld (weld (check ~.types-union-patterns-import src-514 `tok-514 `tre-514) (check-module-types ~.types-union-patterns-import ~[%tests %golden ~.types-union-patterns-import %source %jibb] src-514 `typ-514 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-514-1]])) (check-module-trees ~.types-union-patterns-import `mtre-514 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-514-1]]))
2947+ (weld (weld (check ~.types-union-patterns-import src-518 `tok-518 `tre-518) (check-module-types ~.types-union-patterns-import ~[%tests %golden ~.types-union-patterns-import %source %jibb] src-518 `typ-518 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-518-1]])) (check-module-trees ~.types-union-patterns-import `mtre-518 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-518-1]]))
29232948++ test-types-union-phantom-generic
2924− (weld (check ~.types-union-phantom-generic src-515 `tok-515 `tre-515) (check-types ~.types-union-phantom-generic ~[%tests %golden ~.types-union-phantom-generic %source %jibb] src-515 `typ-515))
2949+ (weld (check ~.types-union-phantom-generic src-519 `tok-519 `tre-519) (check-types ~.types-union-phantom-generic ~[%tests %golden ~.types-union-phantom-generic %source %jibb] src-519 `typ-519))
29252950++ test-types-union-print-cross-namespace
2926− (weld (weld (check ~.types-union-print-cross-namespace src-516 `tok-516 `tre-516) (check-module-types ~.types-union-print-cross-namespace ~[%tests %golden ~.types-union-print-cross-namespace %source %jibb] src-516 `typ-516 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-516-1]])) (check-module-trees ~.types-union-print-cross-namespace `mtre-516 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-516-1]]))
2951+ (weld (weld (check ~.types-union-print-cross-namespace src-520 `tok-520 `tre-520) (check-module-types ~.types-union-print-cross-namespace ~[%tests %golden ~.types-union-print-cross-namespace %source %jibb] src-520 `typ-520 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-520-1]])) (check-module-trees ~.types-union-print-cross-namespace `mtre-520 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-520-1]]))
29272952++ test-types-union-print-distinct
2928− (weld (weld (check ~.types-union-print-distinct src-517 `tok-517 `tre-517) (check-module-types ~.types-union-print-distinct ~[%tests %golden ~.types-union-print-distinct %source %jibb] src-517 `typ-517 ~ ~ ~[['/ui/left.jibb' ~[~.ui ~.left ~.jibb] mod-517-1] ['/ui/right.jibb' ~[~.ui ~.right ~.jibb] mod-517-2] ['/ui/twin.jibb' ~[~.ui ~.twin ~.jibb] mod-517-3]])) (check-module-trees ~.types-union-print-distinct `mtre-517 ~[['/ui/left.jibb' ~[~.ui ~.left ~.jibb] mod-517-1] ['/ui/right.jibb' ~[~.ui ~.right ~.jibb] mod-517-2] ['/ui/twin.jibb' ~[~.ui ~.twin ~.jibb] mod-517-3]]))
2953+ (weld (weld (check ~.types-union-print-distinct src-521 `tok-521 `tre-521) (check-module-types ~.types-union-print-distinct ~[%tests %golden ~.types-union-print-distinct %source %jibb] src-521 `typ-521 ~ ~ ~[['/ui/left.jibb' ~[~.ui ~.left ~.jibb] mod-521-1] ['/ui/right.jibb' ~[~.ui ~.right ~.jibb] mod-521-2] ['/ui/twin.jibb' ~[~.ui ~.twin ~.jibb] mod-521-3]])) (check-module-trees ~.types-union-print-distinct `mtre-521 ~[['/ui/left.jibb' ~[~.ui ~.left ~.jibb] mod-521-1] ['/ui/right.jibb' ~[~.ui ~.right ~.jibb] mod-521-2] ['/ui/twin.jibb' ~[~.ui ~.twin ~.jibb] mod-521-3]]))
29292954++ test-types-union-print-escape
2930− (weld (check ~.types-union-print-escape src-518 `tok-518 `tre-518) (check-types ~.types-union-print-escape ~[%tests %golden ~.types-union-print-escape %source %jibb] src-518 `typ-518))
2955+ (weld (check ~.types-union-print-escape src-522 `tok-522 `tre-522) (check-types ~.types-union-print-escape ~[%tests %golden ~.types-union-print-escape %source %jibb] src-522 `typ-522))
29312956++ test-types-union-print-local
2932− (weld (check ~.types-union-print-local src-519 `tok-519 `tre-519) (check-types ~.types-union-print-local ~[%tests %golden ~.types-union-print-local %source %jibb] src-519 `typ-519))
2957+ (weld (check ~.types-union-print-local src-523 `tok-523 `tre-523) (check-types ~.types-union-print-local ~[%tests %golden ~.types-union-print-local %source %jibb] src-523 `typ-523))
29332958++ test-types-union-print-nested
2934− (weld (check ~.types-union-print-nested src-520 `tok-520 `tre-520) (check-types ~.types-union-print-nested ~[%tests %golden ~.types-union-print-nested %source %jibb] src-520 `typ-520))
2959+ (weld (check ~.types-union-print-nested src-524 `tok-524 `tre-524) (check-types ~.types-union-print-nested ~[%tests %golden ~.types-union-print-nested %source %jibb] src-524 `typ-524))
29352960++ test-types-union-print-same-origin
2936− (weld (weld (check ~.types-union-print-same-origin src-521 `tok-521 `tre-521) (check-module-types ~.types-union-print-same-origin ~[%tests %golden ~.types-union-print-same-origin %source %jibb] src-521 `typ-521 ~ ~ ~[['/ui/shared.jibb' ~[~.ui ~.shared ~.jibb] mod-521-1]])) (check-module-trees ~.types-union-print-same-origin `mtre-521 ~[['/ui/shared.jibb' ~[~.ui ~.shared ~.jibb] mod-521-1]]))
2961+ (weld (weld (check ~.types-union-print-same-origin src-525 `tok-525 `tre-525) (check-module-types ~.types-union-print-same-origin ~[%tests %golden ~.types-union-print-same-origin %source %jibb] src-525 `typ-525 ~ ~ ~[['/ui/shared.jibb' ~[~.ui ~.shared ~.jibb] mod-525-1]])) (check-module-trees ~.types-union-print-same-origin `mtre-525 ~[['/ui/shared.jibb' ~[~.ui ~.shared ~.jibb] mod-525-1]]))
29372962++ test-types-union-print-transitive
2938− (weld (weld (check ~.types-union-print-transitive src-522 `tok-522 `tre-522) (check-module-types ~.types-union-print-transitive ~[%tests %golden ~.types-union-print-transitive %source %jibb] src-522 `typ-522 ~ ~ ~[['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-522-1] ['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-522-2]])) (check-module-trees ~.types-union-print-transitive `mtre-522 ~[['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-522-1] ['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-522-2]]))
2963+ (weld (weld (check ~.types-union-print-transitive src-526 `tok-526 `tre-526) (check-module-types ~.types-union-print-transitive ~[%tests %golden ~.types-union-print-transitive %source %jibb] src-526 `typ-526 ~ ~ ~[['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-526-1] ['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-526-2]])) (check-module-trees ~.types-union-print-transitive `mtre-526 ~[['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-526-1] ['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-526-2]]))
29392964++ test-types-union-singleton
2940− (weld (check ~.types-union-singleton src-523 `tok-523 `tre-523) (check-types ~.types-union-singleton ~[%tests %golden ~.types-union-singleton %source %jibb] src-523 `typ-523))
2965+ (weld (check ~.types-union-singleton src-527 `tok-527 `tre-527) (check-types ~.types-union-singleton ~[%tests %golden ~.types-union-singleton %source %jibb] src-527 `typ-527))
29412966++ test-types-union-tag-atoms
2942− (weld (check ~.types-union-tag-atoms src-524 `tok-524 `tre-524) (check-types ~.types-union-tag-atoms ~[%tests %golden ~.types-union-tag-atoms %source %jibb] src-524 `typ-524))
2967+ (weld (check ~.types-union-tag-atoms src-528 `tok-528 `tre-528) (check-types ~.types-union-tag-atoms ~[%tests %golden ~.types-union-tag-atoms %source %jibb] src-528 `typ-528))
29432968++ test-types-union-tags
2944− (weld (check ~.types-union-tags src-525 `tok-525 `tre-525) (check-types ~.types-union-tags ~[%tests %golden ~.types-union-tags %source %jibb] src-525 `typ-525))
2969+ (weld (check ~.types-union-tags src-529 `tok-529 `tre-529) (check-types ~.types-union-tags ~[%tests %golden ~.types-union-tags %source %jibb] src-529 `typ-529))
29452970++ test-types-union-unresolved
2946− (weld (check ~.types-union-unresolved src-526 `tok-526 `tre-526) (check-types ~.types-union-unresolved ~[%tests %golden ~.types-union-unresolved %source %jibb] src-526 `typ-526))
2971+ (weld (check ~.types-union-unresolved src-530 `tok-530 `tre-530) (check-types ~.types-union-unresolved ~[%tests %golden ~.types-union-unresolved %source %jibb] src-530 `typ-530))
29472972++ test-types-union-unresolved-flow
2948− (weld (check ~.types-union-unresolved-flow src-527 `tok-527 `tre-527) (check-types ~.types-union-unresolved-flow ~[%tests %golden ~.types-union-unresolved-flow %source %jibb] src-527 `typ-527))
2973+ (weld (check ~.types-union-unresolved-flow src-531 `tok-531 `tre-531) (check-types ~.types-union-unresolved-flow ~[%tests %golden ~.types-union-unresolved-flow %source %jibb] src-531 `typ-531))
29492974++ test-types-unit-context
2950− (weld (check ~.types-unit-context src-528 `tok-528 `tre-528) (check-types ~.types-unit-context ~[%tests %golden ~.types-unit-context %source %jibb] src-528 `typ-528))
2975+ (weld (check ~.types-unit-context src-532 `tok-532 `tre-532) (check-types ~.types-unit-context ~[%tests %golden ~.types-unit-context %source %jibb] src-532 `typ-532))
29512976++ test-types-unit-patterns
2952− (weld (check ~.types-unit-patterns src-529 `tok-529 `tre-529) (check-types ~.types-unit-patterns ~[%tests %golden ~.types-unit-patterns %source %jibb] src-529 `typ-529))
2977+ (weld (check ~.types-unit-patterns src-533 `tok-533 `tre-533) (check-types ~.types-unit-patterns ~[%tests %golden ~.types-unit-patterns %source %jibb] src-533 `typ-533))
29532978::
29542979:: +check: run golden:jibb on a case and compare both outputs
29552980::